-
Zveřejněte verzi Oracle, kterou používáte! Nebo můžeme jen hádat...
-
Váš
fflush
nebude fungovat, jak očekáváte – Z dokumentace :FFLUSH fyzicky zapíše nevyřízená data do souboru identifikovaného popisovačem souboru. Normálně se data zapisovaná do souboru ukládají do vyrovnávací paměti. Procedura FFLUSH vynutí zápis dat ve vyrovnávací paměti do souboru. Data musí být ukončena znakem nového řádku.
-
tbone má naprostou pravdu, řádek TO_CHAR(10) je špatně! Stačí zkusit
SELECT TO_CHAR(10) FROM DUAL;
získáte10
který pak porovnáte s jedním znakem. Jediný znak nikdy nebude '10', protože 10 má dva znaky! -
Váš problém je s největší pravděpodobností přetečení vyrovnávací paměti s příliš velkými soubory XML, ale mějte na paměti, že také další problémy v cílovém systému mohou vést k chybám zápisu, které by měly být ošetřeny.
Řešení
-
Quick&Dirty :Protože se zdá, že vás výkon stejně nezajímá, můžete soubor zavřít každých X bajtů a znovu jej otevřít pomocí A pro připojení. Takže stačí přidat do smyčky:
IF MOD( l_offset, 32000 ) = 0 THEN UTL_FILE.FCLOSE( f_out ); UTL_FILE.FOPEN( out_fpath, out_fname, f_out, 'a', 32767 ); END IF;
-
Použijte správný nástroj pro správnou úlohu:
UTL_FILE
není vhodný pro zpracování složitých dat. Jediným případem použití pro UTL_FILE jsou malé řádky textu oddělené novým řádkem. Pro všechno ostatní byste měli psát RAW bajty! (Což vám také umožní dokonalou kontrolu nad ENCODING, což je v současné době jen mini-vanilly-lucky-hádání) -
Napište Java-Stored-Procedure s NIO-Filechannels – rychlý, bezpečný, pěkný... Ale buďte opatrní, váš program může běžet 10krát rychleji!