0

我正在使用下面的函数将行连接成单个列。

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 ;)

4

1 回答 1

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

这样您就可以避免每次都创建自定义函数。

于 2013-09-09T05:02:06.697 回答