将行连接到列; ORA-06502: 错误
Posted
技术标签:
【中文标题】将行连接到列; ORA-06502: 错误【英文标题】:Concatenate rows to column; ORA-06502: error 【发布时间】:2013-09-09 03:00:28 【问题描述】:我正在使用下面的函数将行连接成单个列。
CREATE OR REPLACE FUNCTION getconcat(in_c1 IN t1.c1%TYPE)
RETURN VARCHAR2
IS
value_concat VARCHAR2(1000);
BEGIN
FOR cur_rec IN (SELECT c7
FROM t1
WHERE c1 = in_c1
ORDER BY c1, c2, c3, c4, c5)
LOOP
value_concat := value_concat || ',' || cur_rec.c7;
END LOOP;
RETURN substr(LTRIM(value_concat, ','), 1, 400);
END;
我在主存储过程中调用这个函数
SELECT
C1,
getconcat (C1) AS After_concat,
..............
FROM T1
GROUP BY C1
错误:
ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小 ORA-06512: 在“xx.getconcat”的第 14 行(与其对应的行 value_CONCAT := value_CONCAT || ',' || cur_rec.C7;)
【问题讨论】:
看起来 oracle 认为 1000 个字符不足以让您的所有C7
s 适应。
【参考方案1】:
那是因为你用来连接c7
值的循环超出了value_CONCAT
的长度容量,为避免这种情况,只需将其声明为
value_CONCAT varchar2(4000); --4k is the maximum length for a varchar2
但是,如果你在这个函数中唯一要做的就是连接,你最好使用LISTAGG
函数,试试这样的:
SELECT
C1,
( SELECT
LISTAGG(C7, ',') WITHIN GROUP (ORDER BY C1,C2,C3,C4,C5 )
FROM T1 X
WHERE X.C1=T1.C1 ) After_concat
FROM T1
GROUP BY C1
这样可以避免每次都创建自定义函数。
【讨论】:
但是你应该记住 LISTAGG 可以返回 4000 个字符(最大)。以防万一:)以上是关于将行连接到列; ORA-06502: 错误的主要内容,如果未能解决你的问题,请参考以下文章
ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误;