Agregacja nie jest problemem; błąd pojawia się, gdy próbujesz skrócić końcowy przecinek, który pozostał.
Otrzymujesz niejawną konwersję wyniku XMLAgg, który jest obiektem XMLType, na varchar2; a gdy jego długość przekroczy 4000 znaków, otrzymasz ten błąd, ponieważ jest to maksymalna długość wartości varchar2 w SQL (przynajmniej do Oracle 12c).
Musisz jawnie uzyskać wartość jako CLOB przed wywołaniem rtrim()
, używając 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' );
Możesz także zdefiniować własną funkcję agregującą
które mogą zwrócić CLOB i obsłużyć więcej niż 4000 znaków; które następnie można nazwać bardziej jak listagg()
, bez obejścia XML.