1

次のように 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 行が返される必要があり、すべての ords 値の長さは約 440 文字です。Sql Developer が返す行の 1 つの例は次のとおりです。

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,5510951441414141416951415514155141551415514169550695069506951441616955069514414169550695144141641.

PositionPoints テーブルには、20 を超えるエントリ (最大 254) を持つ LocationID がいくつかあります。これらの行では、連結された文字列が最大 4000 文字を超えると予想されます。ただし、count(sequencenumber) = 20 の場合、連結された文字列の長さは 500 未満になります。Oracle は、HAVING 句で除外した場所に対しても連結を実行し、これらについてエラーを報告していますか?

Oracle Sql Developer と SQL Plus の両方からクエリを実行してみました。

誰かがこの問題に光を当てることができれば幸いです。

ありがとう

4

2 に答える 2

2

最初に集計する行の数を減らし (ご想像のとおり)、次に、減らした数に 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;
于 2013-04-12T11:05:03.217 に答える