将行连接到列; ORA-06502:错误

时间:2013-09-09 03:00:29

标签: oracle function

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

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

1 个答案:

答案 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

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