我正在使用下面的函数将行连接成一列。
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;)
答案 0 :(得分:2)
那是因为你为连接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
这样您就可以避免每次都创建自定义函数。