ORA-01489:甲骨文 - ORA-01489:字符串连接的结果是太长

问题描述:

我对这个查询工作,并得到这个错误:ORA-01489:甲骨文 - ORA-01489:字符串连接的结果是太长

Oracle - ORA-01489: result of string concatenation is too long

有人请帮助解决这个问题

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)) 
+1

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

+0

@JustinCave - ...或者使用'xmlagg()' – mathguy

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

如果你的查询真的返回这么长的字符串?如果不是,你需要处理你的查询。

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

如果聚合列表是长度超过4000个字符的字符串,则该字符串需要是CLOB,并且不能使用listagg()。但是,您可以使用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