Sammenlægningen er ikke problemet; fejlen kommer, når du forsøger at trimme det efterfølgende komma, du sidder tilbage med.
Du får en implicit konvertering af dit XMLAgg-resultat, som er et XMLType-objekt, til varchar2; og når dens længde overstiger 4000 tegn, får du denne fejl, da det er den maksimale længde af en varchar2-værdi i SQL (i det mindste indtil Oracle 12c).
Du skal eksplicit få værdien som en CLOB, før du kalder rtrim()
, ved hjælp af 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 også definere din egen aggregerede funktion
der kan returnere en CLOB og håndtere mere end 4000 tegn; som så kunne kaldes mere som listagg()
uden XML-løsningen.