Nemá smysl pokoušet se generovat velmi velké XML v PL/SQL. Problém není v PL/SQL jako takovém, ale v tom, že PL/SQL podporuje pouze XML DOM a DOM nezvládá velké XML vůbec dobře. Neříkáte, jakou máte velikost XML dokumentu, ale nepřekvapilo by mě, kdybychom zjistili, že paměť používaná PL/SQL k vytvoření vašeho dokumentu je asi 10 až 30krát větší než velikost výsledného dokumentu.
Existuje možnost generovat XML pomocí něčeho jiného než PL/SQL? Pokud ne a opravdu bych musel generovat velké XML soubory v databázi Oracle, zvážil bych použití Java uložených procedur. Tato otázka má nějaké odpovědi na to, jak to udělat v Javě.
UPRAVIT v reakci na váš komentář:váš kód rozhodně nepíše jeden řádek po druhém. Píše to dohromady, což jsem si ověřil spuštěním pomocí dotazu SELECT * FROM all_objects
v mé databázi Oracle 11g XE. Smyčka proběhla jednou a zapsala 7341 objektů, čímž vznikl soubor XML o velikosti něco málo přes 3 MB.
Poté jsem se pokusil upravit váš kód, aby lépe podporoval „přírůstkový“ přístup, který popisujete. To zahrnovalo:
-
přidání řádku
dbms_xmlgen.setmaxrows(ctx, max_rows);
říct DBMS_XMLGEN, aby generoval pouze 5 řádků najednou. Jinak se pokusí vygenerovat dávku najednou. -
úpravou kódu v horní části
WHILE
smyčka doxml_result := dbms_xmlgen.getXML(ctx); num_rows_processed := DBMS_XMLGEN.GETNUMROWSPROCESSED(ctx); dbms_output.put_line('Got ' || num_rows_processed || ' rows processed'); while num_rows_processed > 0 -- rest of loop omitted
-
přidání prvního z těchto tří řádků těsně před konec
WHILE
smyčka.
Potom jsem znovu spustil váš kód a viděl jsem, jak pokaždé zapisuje každou dávku pěti řádků do souboru. Tento přístup má však malý problém, protože soubor byl pokaždé přepsán. Na konci jsem měl ve výstupním XML souboru pouze jeden záznam. Nedokážu si představit, že by to bylo to, co chcete.
WRITETOCLOB
, WRITETOBUFFER
a WRITETOFILE
metody v DBMS_XMLDOM
nenaznačujte možnost připojit k existujícímu souboru a upřímně řečeno se ani nedivím, že tomu tak není. Pokud byste mohli, skončili byste s neplatným XML, protože by existovalo více než jeden <?xml ... ?>
prohlášení v souboru.
Za svými předchozími radami si stojím. Kdykoli se potřebujete vypořádat s velkým XML, v databázi Oracle nebo jinde, použijte SAX nebo StAX. PL/SQL nepodporuje ani jeden, takže cokoli potřebujete udělat v uložených procedurách Java, nebo to udělat mimo databázi.