L'aggregazione non è il problema; l'errore si verifica quando provi a tagliare la virgola finale che ti rimane.
Stai ottenendo una conversione implicita del tuo risultato XMLAgg, che è un oggetto XMLType, in varchar2; e quando la sua lunghezza supera i 4000 caratteri, riceverai questo errore poiché è la lunghezza massima di un valore varchar2 in SQL (almeno, fino a Oracle 12c).
Devi ottenere esplicitamente il valore come CLOB prima di chiamare rtrim()
, utilizzando 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' );
Puoi anche definire la tua funzione di aggregazione
che può restituire un CLOB e gestire più di 4000 caratteri; che potrebbe quindi essere chiamato più come listagg()
, senza la soluzione XML.