集約は問題ではありません。残っている末尾のカンマを削除しようとすると、エラーが発生します。
XMLTypeオブジェクトであるXMLAgg結果がvarchar2に暗黙的に変換されます。また、その長さが4000文字を超えると、SQLのvarchar2値の最大長であるため(少なくともOracle 12cまで)、このエラーが発生します。
rtrim()
を呼び出す前に、値をCLOBとして明示的に取得する必要があります。 、getclobval()
を使用 :
select Rtrim(
(Xmlagg(Xmlelement(e,wonum||',')).extract('//text()')).getclobval(),
',') as wolist
from ( select w.wonum from workorder w
connect by prior w.wonum = w.parent and prior w.siteid = siteid
start with w.siteid = 'ABCD' and w.wonum = 'P1234' );
独自の集計関数
を定義することもできます。 CLOBを返し、4000文字を超える文字を処理できます。これは、listagg()
のように呼び出すことができます。 、XMLの回避策なし。