Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreur de tampon trop petit lors de l'utilisation de XMLAgg/XMLElement

L'agrégation n'est pas le problème; l'erreur se produit lorsque vous essayez de supprimer la virgule de fin qui vous reste.

Vous obtenez une conversion implicite de votre résultat XMLAgg, qui est un objet XMLType, en varchar2 ; et lorsque sa longueur dépasse 4000 caractères, vous obtiendrez cette erreur car il s'agit de la longueur maximale d'une valeur varchar2 en SQL (au moins jusqu'à Oracle 12c).

Vous devez obtenir explicitement la valeur en tant que CLOB avant d'appeler rtrim() , en utilisant 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' );

Vous pouvez également définir votre propre fonction d'agrégation qui peut retourner un CLOB et gérer plus de 4000 caractères ; qui pourrait alors être appelé plus comme listagg() , sans la solution de contournement XML.