“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 ...