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

“Oracle存储过程抛出”;没有足够的价值观”;错误,oracle,stored-procedures,listagg,Oracle,Stored Procedures,Listagg,此查询返回我想要的内容(查询中以逗号分隔的值) 结果: Squash,Tennis,Walking 初始数据: emp_id hobbies ------------------- 123456 Walking 123456 Tennis 123456 Squash 000001 Bowling 000002 Tennis 000002 Soccer 当我尝试将其转换为存储过程时,如下所示: CREATE OR REPLACE PROCEDURE GET_EMP_

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

结果:

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\u id
listag()
结果-但您只选择了一个变量
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
变量必须足够大才能容纳组合字符串


这取决于在局部变量中包含这些值后,您计划对其执行什么操作。

创建过程。。。是
,而不是作为@TimBiegeleisen-*8-)我想实际使用一个OUT变量,并将CSV输出到该变量中。我可以更新我的问题,不管它们是局部变量还是外部参数;如果列表达式和
into
targets,则仍然需要相同的数字。是的,因此我添加了一个额外的out变量作为into目标,但这只显示一个值,而不是全部三个值。我的apolgoies,上述方法有效。非常感谢你的帮助。
...
AS
    l_hobbies varchar2(4000); -- has to be big enough
BEGIN
    SELECT LISTAGG(HOBBIES, ',') WITHIN GROUP (ORDER BY HOBBIES)
    INTO l_hobbies
    FROM ...