Oracle
 sql >> Datenbank >  >> RDS >> Oracle

UTL_FILE.WRITE_ERROR beim Aufruf von utl_file.put in einer Schleife

  1. Posten Sie die Oracle-Version, die Sie verwenden! Oder wir können einfach herumraten...

  2. Ihr fflush funktioniert nicht wie erwartet - Aus der Dokumentation :

    FFLUSH schreibt anstehende Daten physisch in die Datei, die durch die Dateikennung identifiziert wird. Normalerweise werden Daten, die in eine Datei geschrieben werden, gepuffert. Die FLUSH-Prozedur erzwingt das Schreiben der gepufferten Daten in die Datei. Die Daten müssen mit einem Newline-Zeichen abgeschlossen werden.

  3. tbone ist absolut richtig, die Zeile TO_CHAR(10) ist falsch! Versuchen Sie einfach SELECT TO_CHAR(10) FROM DUAL; Sie erhalten 10 die Sie dann mit einem einzelnen Zeichen vergleichen. Ein einzelnes Zeichen wird niemals '10' sein, da 10 zwei Zeichen hat!

  4. Ihr Problem ist höchstwahrscheinlich ein Pufferüberlauf mit zu großen XML-Dateien, aber denken Sie daran, dass auch andere Probleme auf dem Zielsystem zu Write_errors führen können, die behandelt werden sollten.

Lösungen

  • Quick&Dirty :Da Sie sich anscheinend sowieso nicht um die Leistung kümmern, können Sie die Datei einfach alle X-Byte schließen und mit A für Anhängen erneut öffnen. Fügen Sie also einfach zur Schleife hinzu:

    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;
    
  • Verwenden Sie das richtige Tool für den richtigen Job:UTL_FILE ist für den Umgang mit komplexen Daten nicht geeignet. Der einzige Anwendungsfall für UTL_FILE sind kleine durch Zeilenumbrüche getrennte Textzeilen. Für alles andere sollten Sie RAW-Bytes schreiben! (Was Ihnen auch eine bessere Kontrolle über ENCODING ermöglicht, was derzeit nur eine Mini-Vanilly-Glücksvermutung ist)

  • Schreiben Sie eine Java-Stored-Procedure mit NIO-Filechannels - schnell, sicher, nett... Aber Vorsicht, Ihr Programm könnte 10 mal so schnell laufen!