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_idlistagg()结果 - 但您只选择单个变量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: 没有足够的值?代码如下:

Oracle 选择变量,错误 ORA-00947 没有足够的值

ORACLE 没有足够的值 和 值过多 的区别

Oracle存储过程记录异常

ORA-00947: 将值放入过程中的类型时没有足够的值

向oracle数据库中添加数据时提示ORA-00947: 没有足够的值