如何用listag函数解决连接异常?

mlnl4t2r  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(577)

嗨,我正在尝试执行下面的查询,它使用listag函数。查询会给出结果,但当我尝试从网格中提取更多记录或尝试获取记录计数时,它会给出错误: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

任何帮助都将不胜感激

zkure5ic

zkure5ic1#

这是一个有点长的评论。
两件事正在发生。首先,oracle将字符串的长度限制为2000个字符。第二,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;

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

l5tcr1uw

l5tcr1uw2#

您可以使用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

相关问题