"ORA-01489:result of string concatenation is too long"(字符串很小)



我试图使用listagg函数如下,但我得到ORA-01489:字符串连接的结果太长。

SELECT LOCATIONID, LISTAGG(TO_CHAR(XPOSITION||','||YPOSITION), ',') WITHIN GROUP (ORDER BY SEQUENCENUMBER) ords
FROM POSITIONPOINTS 
GROUP BY LOCATIONID
HAVING COUNT(SEQUENCENUMBER) = 20;

当我尝试在Oracle Sql Developer中运行此程序时,它显示前1550行,然后报告ORA-01489错误。总共应该返回2612行,所有单词值的长度大约为440个字符。Sql Developer返回的其中一行的一个示例是:

22372682

410434.801, 551142.885, 410434.784, 551142.875, 410439.801, 551141.922, 410439.991, 551141.795, 410439.293, 551138.303, 410438.531, 551137.668, 410429.768, 551134.302, 410427.228, 551133.159, 410426.212, 551132.143, 410425.196, 551129.667, 410421.957, 551114.3, 410414.972, 551081.28, 410413.639, 551076.136, 410412.94, 551073.66, 410412.94, 551072.326, 410413.639, 551071.628, 410415.798, 551070.612, 410416.369, 551069.469, 410416.877, 551068.834, 410433.23, 551061.795

在PositionPoints表中有一些locationid,它有超过20个条目(最大是254),对于这些行,我希望连接的字符串超过最大4000个字符。但是,当count(sequencenumber) = 20时,连接的字符串长度将小于500。Oracle是否执行连接,即使我已经排除了我的HAVING子句的位置,并报告错误?

我已经尝试从Oracle Sql Developer和Sql Plus运行查询。

如果有人能说明这个问题,我将不胜感激。

谢谢

您需要首先减少正在聚合的行数(如您所猜测的),然后对减少的行数应用listagg()。

像这样:

select locationid, 
       listagg(to_char(xposition||','||yposition), ',') within group (order by sequencenumber) ords
from (
  select locationid, 
         xposition, 
         yposition, 
         sequencenumber,
         count(sequencenumber) over (partition by locationid) as cnt
  from positionpoints 
) t
where cnt = 20
group by locationid;

Oracle是否执行连接,即使是我用HAVING子句排除的位置,并在这些上报告错误?

是的。

最新更新