oracle中没有足够的值,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:值不够

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

1

投票

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值