首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用LISTAGG函数解决拼接异常?

如何用LISTAGG函数解决拼接异常?
EN

Stack Overflow用户
提问于 2020-06-16 22:00:47
回答 2查看 78关注 0票数 0

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

查询:

代码语言:javascript
运行
复制
 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

任何帮助都将不胜感激

EN

回答 2

Stack Overflow用户

发布于 2020-06-16 22:04:08

这对于评论来说有点长了。

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

因此,我怀疑前几行没有问题--结果字符串首先在限制范围内。然而,当引擎遍历数据时,它会遇到一个不好的行。

您可以使用以下命令找出导致此问题的值:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2020-06-16 22:19:43

您可以通过使用ON OVERFLOW TRUNCATE '...‘来防止错误。这将在达到限制之前剪切您的结果字符串。但请注意,在这种情况下,它将被削减。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62410327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档