如何使用LISTAGG函数解决串联异常?

问题描述 投票:0回答:2

[嗨,我正在尝试执行以下使用LISTAGG函数的查询。该查询给出了结果,但是当我尝试从网格中提取更多记录或尝试获取记录数时,它给了我错误:ORA-01489:字符串连接的结果太长。

查询:

 SELECT  sceng_eng_id AS eng_id,
    SUBSTRB(LISTAGG(sceng_pr_eid, ',') WITHIN GROUP (ORDER BY sceng_eng_id,sceng_pr_eid),1,100) secengs,
    SUBSTR(LISTAGG(sceng_eng_nme, ',') WITHIN GROUP (ORDER BY sceng_eng_id,sceng_pr_eid),1,256) secengnme
        FROM seceng group by sceng_eng_id

任何帮助都会受到感激

sql oracle12c listagg
2个回答
0
投票

对于评论,这有点长。

发生两件事。首先,Oracle将字符串的长度限制为2,000个字符。其次,Oracle通常在行可用时返回行,而不是生成整个结果集。

因此,我怀疑前几行很好-最终产生的字符串在限制范围内处于舒适状态。但是,当引擎处理数据时,它偶然遇到了错误的行。

您可以使用以下方法找出引起此问题的值:

select ceng_eng_id AS eng_id, sum(len(sceng_pr_eid) + 1), sum(len(sceng_eng_nme) + 1)
from t
group by ceng_eng_id
having sum(len(sceng_pr_eid) + 1) >= 2000 or 
       sum(len(sceng_eng_nme) + 1) >= 2000;

尚不清楚您想做什么;也许您可以修复数据,或者可能还有其他选择。


0
投票

您可以通过使用ON OVERFLOW TRUNCATE'...'来防止错误,该操作会在达到限制之前将您生成的字符串切掉。但请注意,在这种情况下将被剪裁。

SELECT  sceng_eng_id AS eng_id,
    SUBSTRB(LISTAGG(sceng_pr_eid, ','ON OVERFLOW TRUNCATE '...') WITHIN GROUP (ORDER BY sceng_eng_id,sceng_pr_eid),1,100) secengs,
    SUBSTR(LISTAGG(sceng_eng_nme, ',' ON OVERFLOW TRUNCATE '...') WITHIN GROUP (ORDER BY sceng_eng_id,sceng_pr_eid),1,256) secengnme
        FROM seceng group by sceng_eng_id
© www.soinside.com 2019 - 2024. All rights reserved.