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.