Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Buffer de erro muito pequeno ao usar XMLAgg/XMLElement


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.