Oracle存储过程抛出“没有足够的值”错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle存储过程抛出“没有足够的值”错误相关的知识,希望对你有一定的参考价值。
此查询返回我想要的内容(来自查询的逗号分隔值)
SELECT emp_id, LISTAGG(HOBBIES, ',') WITHIN GROUP (ORDER BY HOBBIES)
FROM employee_list
WHERE emp_id = 123456
GROUP BY emp_id;
结果:
Squash,Tennis,Walking
初步数据:
emp_id hobbies
-------------------
123456 Walking
123456 Tennis
123456 Squash
000001 Bowling
000002 Tennis
000002 Soccer
当我尝试将其转换为这样的存储过程时:
CREATE OR REPLACE PROCEDURE GET_EMP_ID_FOR_HOBBIES(id NUMBER)
AS
x varchar(255);
BEGIN
SELECT emp_id, LISTAGG(HOBBIES, ',') WITHIN GROUP (ORDER BY HOBBIES)
INTO x
FROM employee_list
WHERE emp_id = id
GROUP BY HOBBIES;
END;
它在编译时返回以下错误
错误(6,8):PL / SQL:ORA-00947:值不够
如果它是插入物,我会理解它。我做错了什么?
答案
您正在选择两个列表达式emp_id
和listagg()
结果 - 但您只选择单个变量x
。
您需要两个变量,并在into
子句中列出,以匹配列表达式。
...
AS
l_emp_id employee_list.emp_id%TYPE;
l_hobbies varchar2(4000); -- has to be big enough
BEGIN
SELECT emp_id, LISTAGG(HOBBIES, ',') WITHIN GROUP (ORDER BY HOBBIES)
INTO l_emp_id, l_hobbies
FROM employee_list
WHERE emp_id = id
GROUP BY emp_id;
...
如果你确实想要一个变量,那么你需要一个列表达式 - 要么删除其中一个,因为你真的不需要另一个ID副本:
...
AS
l_hobbies varchar2(4000); -- has to be big enough
BEGIN
SELECT LISTAGG(HOBBIES, ',') WITHIN GROUP (ORDER BY HOBBIES)
INTO l_hobbies
FROM ...
或者可能不太可能,将ID和爱好连接成单个字符串值。当然,x
变量必须足够大以容纳组合字符串。
这取决于您在局部变量中使用它们后计划对值进行的操作。
以上是关于Oracle存储过程抛出“没有足够的值”错误的主要内容,如果未能解决你的问题,请参考以下文章
oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下: