您好,我正在尝试执行以下使用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任何帮助都将不胜感激
发布于 2020-06-16 22:04:08
这对于评论来说有点长了。
有两件事正在发生。首先,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;不清楚您想要做什么;也许您可以修复数据,也可能有其他选择。
发布于 2020-06-16 22:19:43
您可以通过使用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_idhttps://stackoverflow.com/questions/62410327
复制相似问题