Oracle
 sql >> Database >  >> RDS >> Oracle

Errore troppo piccolo nel buffer durante l'utilizzo di XMLAgg/XMLElement

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.