Oracle
 sql >> база данни >  >> RDS >> Oracle

Твърде малък буфер при използване на XMLAgg/XMLElement

Агрегацията не е проблемът; грешката идва, когато се опитате да отрежете крайната запетая, която остава.

Получавате имплицитно преобразуване на вашия 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 заобиколното решение.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Последователност на Oracle, започваща с 2 вместо с 1

  2. Oracle:копиране на ред при актуализиране на едно поле

  3. Как да експортирате само текст за печат (или всяко друго свойство на пакет) в wireshark

  4. for цикъл вътре в оракул на курсора

  5. Потребителска парола за гост в 11i/R12