将行连接到列; 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 个字符不足以让您的所有 C7s 适应。 【参考方案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

PL/SQL - 防止 ORA-06502

ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误;

PL/SQL: 数字或值错误 - ORA-06502

ORA-06502: PL/SQL: 数字或值错误,我贴出来,大家帮我改一下,以前没怎么写过存储过程。。

故障解决ORA-06502错误解决