首页 > 解决方案 > 过程创建时出现编译错误 PL/SQL: ORA-00947: not enough values

问题描述

create or replace procedure numOfSupplier(X IN NUMBER)IS

OUTPUT VARCHAR2(300);

BEGIN
SELECT R_NAME, N_NAME, COUNT(S_NATIONKEY)
into output
FROM SUPPLIER join NATION on S_NATIONKEY = N_NATIONKEY
join REGION on N_REGIONKEY = R_REGIONKEY
GROUP BY R_NAME, N_NAME
HAVING COUNT (S_NATIONKEY) > X;

dbms_output.put_line( OUTPUT );

END numOfSupplier; 
/

我正在尝试创建一个程序,其中我指定一个数字,例如 130,它将列出地区名称、国家名称以及该国家超过 130 的供应商数量。我的预期输出是例如

R_NAME N_Name COUNT(S_NATIONEKY)


亚洲 印度尼西亚 131

亚洲 中国 132

但是,当我运行我的脚本时,它返回 PL/SQL: ORA-00947: not enough values。我不确定为什么会这样。我已经单独运行了我的 select 语句,它工作正常,但是当我把它变成一个程序时它不起作用。那里的任何人都可以帮我确定问题出在哪里。

标签: oracleplsql

解决方案


另一种方法是连接到一个字符串,这样你就得到了一个 R_NAME、N_NAME 和 COUNT 的连接字符串数组。

修改程序如下,

create or replace procedure numOfSupplier(X IN NUMBER)IS

TYPE type_supplier  is table of varchar2(200) Index by binary_integer;
tab_supplier type_supplier;
counter NUMBER(10):=0;

BEGIN

--Cursor to loop through the records returned
for cur_suppliers in
(SELECT R_NAME||' '|| N_NAME||' '|| COUNT(S_NATIONKEY) output
FROM SUPPLIER join NATION on S_NATIONKEY = N_NATIONKEY
join REGION on N_REGIONKEY = R_REGIONKEY
GROUP BY R_NAME, N_NAME
HAVING COUNT (S_NATIONKEY) > X)


LOOP
counter := counter + 1;
--Load the data to array indexed by integer 
 tab_supplier(counter) := cur_suppliers.output;
END LOOP;

--Loop through the array and print the array 
FOR i IN tab_supplier.FIRST..tab_supplier.LAST LOOP
Dbms_output.put_line ('Values are : ' ||tab_supplier(i));

END LOOP;

END numOfSupplier; 
/

在匿名块中运行该过程应该返回,

EXEC numOfSupplier;

Values are : ASIA INDONESIA 131
Values are : EUROPE UK 121
Values are : ASIA INDIA 111

推荐阅读