Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Błąd zbyt małego bufora podczas używania XMLAgg/XMLElement

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz nowego użytkownika Oracle i przyznaj uprawnienia:składnia i przykłady

  2. Uzyskaj liczbę wszystkich tabel w schemacie

  3. problem z plikami apex_application_temp_files

  4. Czy można uzyskać wiele wartości z podzapytania?

  5. Sekwencja hibernacji na oracle, @GeneratedValue(strategy =GenerationType.AUTO)