Агрегацията не е проблемът; грешката идва, когато се опитате да отрежете крайната запетая, която остава.
Получавате имплицитно преобразуване на вашия XMLAgg резултат, който е XMLType обект, във varchar2; и когато дължината й надвишава 4000 знака, ще получите тази грешка, тъй като това е максималната дължина на стойност varchar2 в SQL (поне до Oracle 12c).
Трябва изрично да получите стойността като CLOB, преди да извикате rtrim()
, използвайки 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' );
Можете също така да дефинирате ваша собствена агрегатна функция
който може да върне CLOB и да обработва повече от 4000 знака; което след това може да се извика по-скоро като listagg()
, без XML заобиколното решение.