我处理此查询并收到此错误:
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))
答案 0 :(得分:1)
如果聚合列表是一个长度超过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
答案 1 :(得分:0)
在Oracle的SQL查询中,字符串(VARCHAR类型的列)限制为4000个字符。显然,您的查询会创建更长的字符串,因此会失败。这可以通过LISTAGG
轻松实现。
您的查询是否真的会返回如此长的字符串?如果没有,您需要处理您的查询。
如果您确实需要超过4000个字符的值,则可以尝试使用自定义用户定义的聚合函数来使用CLOB而不是VARCHAR。 Tom Kyte在他的一个问题中有一个example。