我试图使用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返回的其中一行的一个示例是:
22372682410434.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子句排除的位置,并在这些上报告错误?
是的。