Oracle存储过程抛出“没有足够的值”错误

问题描述 投票:0回答:1

此查询返回我想要的内容(来自查询的逗号分隔值)

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:值不够

如果它是插入物,我会理解它。我做错了什么?

oracle stored-procedures listagg
1个回答
1
投票

您正在选择两个列表达式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变量必须足够大以容纳组合字符串。

这取决于您在局部变量中使用它们后计划对值进行的操作。

© www.soinside.com 2019 - 2024. All rights reserved.