Oracle
 sql >> Database >  >> RDS >> Oracle

UTL_FILE.WRITE_ERROR quando si chiama utl_file.put in un ciclo

  1. Pubblica la versione Oracle che stai utilizzando! Oppure possiamo solo tirare a indovinare...

  2. Il tuo fflush non funzionerà come previsto - Dalla documentazione :

    FFLUSH scrive fisicamente i dati in sospeso nel file identificato dall'handle del file. Normalmente, i dati scritti su un file sono memorizzati nel buffer. La procedura FFLUSH forza la scrittura nel file dei dati memorizzati nel buffer. I dati devono essere terminati con un carattere di nuova riga.

  3. tbone ha assolutamente ragione la riga TO_CHAR(10) è sbagliata! Prova a SELECT TO_CHAR(10) FROM DUAL; otterrai 10 che poi confronti con un singolo carattere. Un singolo carattere non sarà mai "10" poiché 10 ha due caratteri!

  4. Il tuo problema è molto probabilmente un buffer overflow con file XML troppo grandi, ma tieni presente che anche altri problemi sul sistema di destinazione possono portare a write_errors, che dovrebbero essere gestiti.

Soluzioni

  • Quick&Dirty :Dal momento che non sembri comunque interessarti delle prestazioni, puoi semplicemente chiudere il file ogni X byte e riaprirlo con A per append. Quindi aggiungi al ciclo:

    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;
    
  • Usa lo strumento giusto per il lavoro giusto:UTL_FILE non è adatto per la gestione di dati complessi. L'unico caso d'uso per UTL_FILE sono piccole righe di testo separate da una nuova riga. Per tutto il resto dovresti scrivere byte RAW! (Il che ti consentirà anche il controllo su ENCODING, che al momento è solo un'ipotesi mini-vaniglia-fortunata)

  • Scrivi una procedura Java-Stored con NIO-Filechannels:veloce, sicura, piacevole... Ma attenzione, il tuo programma potrebbe essere 10 volte più veloce!