sql >> Databáze >  >> RDS >> Oracle

UTL_FILE.WRITE_ERROR při volání utl_file.put ve smyčce

  1. Zveřejněte verzi Oracle, kterou používáte! Nebo můžeme jen hádat...

  2. 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.

  3. tbone má naprostou pravdu, řádek TO_CHAR(10) je špatně! Stačí zkusit SELECT TO_CHAR(10) FROM DUAL; získáte 10 který pak porovnáte s jedním znakem. Jediný znak nikdy nebude '10', protože 10 má dva znaky!

  4. 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!



  1. Získejte data za posledních 8 hodin ve sloupci Datum a čas Výmluvné

  2. Použití PHPExcel k automatickému vytváření souborů Excel

  3. Zkopírujte data do nové tabulky v MySQL

  4. Jaký je rozdíl mezi CHAR a VARCHAR v SQL Server - SQL Server / T-SQL výukový program, část 31