[嗨,我正在尝试执行以下使用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
任何帮助都会受到感激
对于评论,这有点长。
发生两件事。首先,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;
尚不清楚您想做什么;也许您可以修复数据,或者可能还有其他选择。
您可以通过使用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