Aggregeringen är inte problemet; felet kommer när du försöker klippa bort det avslutande kommatecken du har kvar.
Du får en implicit konvertering av ditt XMLAgg-resultat, som är ett XMLType-objekt, till varchar2; och när dess längd överstiger 4000 tecken får du det här felet eftersom det är den maximala längden på ett varchar2-värde i SQL (åtminstone fram till Oracle 12c).
Du måste uttryckligen få värdet som en CLOB innan du anropar rtrim()
, med 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' );
Du kan också definiera din egen aggregatfunktion
som kan returnera en CLOB och hantera mer än 4000 tecken; som sedan kan kallas mer som listagg()
, utan XML-lösningen.