过程创建时出现编译错误 PL/SQL: ORA-00947: not enough values
Posted
技术标签:
【中文标题】过程创建时出现编译错误 PL/SQL: ORA-00947: not enough values【英文标题】:Procedure created with compilation error PL/SQL: ORA-00947: not enough values 【发布时间】:2020-04-30 14:23:38 【问题描述】: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 语句,它工作正常,但是当我把它变成一个程序时它不起作用。那里的任何人都可以帮我确定问题出在哪里。
【问题讨论】:
【参考方案1】:另一种方法是连接到一个字符串,这样你会得到一个 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
【讨论】:
您好,先生,我已经尝试过您的方法,现在程序运行良好。但是,当我运行我的程序时,它返回 3 个错误: ORA-01422:精确获取返回的行数超过了请求的行数 ORA-06512:在“CSCI235.NUMBEROFSUPPLIER”,第 7 行 ORA-06512:在第 1 行 这就是它应该工作的方式。我相信查询为您传递的 X 值返回多行。变量“输出”是 varchar 并且只能采用单个字符串而不是字符串数组。按 R_NAME、N_NAME 分组将返回多行,这些行无法由 varchar 数据类型处理。你需要一个数组来处理它。让我知道这是否是您想要的? 是的,我实际上正在考虑返回多行。我是 sqlplus 的新手,所以我不太确定如何将字符串存储到数组中来处理它。我也想在列中打印出来?所以我最初的假设是将输出作为我可以连接的字符串。感谢您的帮助先生 请参考更新后的代码。现在这将返回一个由二进制整数索引的 VARCHAR2 数组。您还可以定义具有多个列的多维数组,允许将 3 列中的每一列分别存储在数组中。更多信息请参考orafaq.com/forum/t/42139/0 您好先生,非常感谢您更新的代码,但这个过程的主要目标是我可以给它一个数字参数,例如 130,这样我就可以打印出带有区域名称的记录行,国家名称和供应商数量超过130个?以上是关于过程创建时出现编译错误 PL/SQL: ORA-00947: not enough values的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误