sql >> Databasteknik >  >> RDS >> Oracle

Bufferten för litet fel när du använder XMLAgg/XMLElement

Aggregeringen är inte problemet; felet kommer när du försöker klippa bort det avslutande kommatecken du har kvar.

Du får en implicit konvertering av ditt XMLAgg-resultat, som är ett XMLType-objekt, till varchar2; och när dess längd överstiger 4000 tecken får du det här felet eftersom det är den maximala längden på ett varchar2-värde i SQL (åtminstone fram till Oracle 12c).

Du måste uttryckligen få värdet som en CLOB innan du anropar rtrim() , med 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' );

Du kan också definiera din egen aggregatfunktion som kan returnera en CLOB och hantera mer än 4000 tecken; som sedan kan kallas mer som listagg() , utan XML-lösningen.




  1. I Oracle 11g hur tidsvikter du i genomsnitt data per timme mellan två datum?

  2. Hur väljer man 1d array från 2d array?

  3. Oracle SQL kapslade relation till en nivå

  4. problem med timer i orakelform