过程创建时出现编译错误 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 列信息时出现存储过程错误

使用存储过程执行 PL/SQL 代码时出现问题

在 pl/sql 中创建过程时出现错误

创建过程oracle sql developer时出现异常错误

尝试创建 PL/SQL 函数时出现神秘错误

为啥在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误?