A agregação não é o problema; o erro está chegando quando você tenta cortar a vírgula à direita que resta.
Você está obtendo uma conversão implícita de seu resultado XMLAgg, que é um objeto XMLType, para varchar2; e quando seu comprimento exceder 4000 caracteres, você receberá esse erro, pois esse é o comprimento máximo de um valor varchar2 no SQL (pelo menos, até o Oracle 12c).
Você precisa obter explicitamente o valor como um CLOB antes de chamar
rtrim()
, usando 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' );
Você também pode definir sua própria função agregada que pode retornar um CLOB e manipular mais de 4.000 caracteres; que poderia então ser chamado mais como
listagg()
, sem a solução alternativa XML.