ORA-01489:Oracle-ORA-01489:字符串连接的结果太长

ORA-01489:Oracle-ORA-01489:字符串连接的结果太长,oracle,oracle11g,Oracle,Oracle11g,我处理此查询并得到以下错误: Oracle-ORA-01489:字符串连接的结果太长 请有人帮忙解决这个问题 SELECT LISTAGG(RCRDNUM) WITHIN GROUP (ORDER BY RCRDNUM) FROM (SELECT (ERR.RCRDNUM || ',') AS RCRDNUM FROM TABLENAME ERR INNER JOIN (SELECT UPPER(REGEXP_SUBSTR('No value present for CN

我处理此查询并得到以下错误:

Oracle-ORA-01489:字符串连接的结果太长

请有人帮忙解决这个问题

SELECT LISTAGG(RCRDNUM) WITHIN GROUP (ORDER BY RCRDNUM)
FROM (SELECT (ERR.RCRDNUM || ',') AS RCRDNUM
      FROM TABLENAME ERR
      INNER JOIN (SELECT UPPER(REGEXP_SUBSTR('No value present for CNTRY_CD column for the record',
                                             '[^,]+', 1, LEVEL)) ERR_MSG
                  FROM DUAL
                  CONNECT BY REGEXP_SUBSTR('No value present for CNTRY_CD column for the record',
                                           '[^,]+', 1, LEVEL)
                      IS NOT NULL) ERRMSG_P
      ON (UPPER(ERR.ERRMSG) = ERRMSG_P.ERR_MSG
          OR 'No value present for CNTRY_CD column for the record' IS NULL))

在Oracle的SQL查询中,字符串(VARCHAR类型的列)限制为4000个字符。显然,查询会创建更长的字符串,因此会失败。这在
listag
中很容易发生

您的查询真的应该返回这么长的字符串吗?如果没有,则需要处理查询


如果您确实需要超过4000个字符的值,可以尝试使用CLOB而不是VARCHAR,方法是使用自定义用户定义的聚合函数。Tom Kyte的一个问题中有一个问题。

如果聚合列表是一个长度超过4000个字符的字符串,则该字符串必须是CLOB,并且不能使用
listag()
。但是,您可以使用
xmlagg()
,它没有4000个字符的限制。但结果必须是CLOB,并且在解决方案中转换为CLOB

。这是一个概念证明;我会让你适应你的情况

with a (id,val) as (select 10, 'x' from dual union all select 20, 'abc' from dual)
select listagg(val, ',') within group (order by id) as l_agg,
       rtrim( xmlcast( xmlagg( xmlelement(e, val || ',') order by id) as clob), ',')
       as clob_agg
from   a
; 
输出

L_AGG      CLOB_AGG
---------- ----------
x,abc      x,abc

listag
的结果是否可能超过4000个字符?如果是这样,就不能使用
listag
(或者需要在内联视图中提供一个过滤器,以减少返回的行数)。如果需要生成更长的字符串,可以编写自己的聚合函数来处理
clob
数据类型(有一些在线实现)。@JustinCave-。。。或者使用
xmlagg()