Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehler „Puffer zu klein“ bei Verwendung von XMLAgg/XMLElement

Die Aggregation ist nicht das Problem; Der Fehler tritt auf, wenn Sie versuchen, das abschließende Komma abzuschneiden, das übrig bleibt.

Sie erhalten eine implizite Konvertierung Ihres XMLAgg-Ergebnisses, das ein XMLType-Objekt ist, in varchar2; und wenn seine Länge 4000 Zeichen überschreitet, erhalten Sie diesen Fehler, da dies die maximale Länge eines varchar2-Werts in SQL ist (zumindest bis Oracle 12c).

Sie müssen den Wert explizit als CLOB abrufen, bevor Sie rtrim() aufrufen , mit 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' );

Sie könnten auch Ihre eigene Aggregatfunktion definieren die ein CLOB zurückgeben und mehr als 4000 Zeichen verarbeiten kann; das könnte dann eher wie listagg() aufgerufen werden , ohne die XML-Problemumgehung.