【问题标题】:Oracle stored procedure throwing "not enough values" errorOracle 存储过程抛出“没有足够的值”错误
【发布时间】:2019-07-11 01:24:57
【问题描述】:

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

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:没有足够的值

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

【问题讨论】:

  • CREATE PROCEDURE ... ISIS,不是AS
  • @TimBiegeleisen - really? *8-)

标签: oracle stored-procedures listagg


【解决方案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 变量必须足够大以容纳该组合字符串。

这取决于您将这些值放在局部变量中后打算如何处理它们。

【讨论】:

  • 我想实际使用一个 OUT 变量,并将 CSV 输出到该变量中。我可以更新我的问题。
  • 不管是局部变量还是OUT参数;如果列表达式和into 目标,您仍然需要相同的数字。
  • 是的,所以我添加了一个额外的 out 变量作为 into 目标,但它只显示一个值,而不是全部三个。
  • 我的道歉,以上工作。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多