sql >> Databasteknik >  >> RDS >> Oracle

UTL_FILE.WRITE_ERROR när utl_file.put anropas i en loop

  1. Lägg upp Oracle-versionen du använder! Eller så kan vi bara gissa runt...

  2. Din fflush kommer inte att fungera som du förväntar dig - Från dokumentationen :

    FFLUSH skriver fysiskt väntande data till filen som identifieras av filhandtaget. Normalt buffras data som skrivs till en fil. FLLUSH-proceduren tvingar den buffrade datan att skrivas till filen. Datan måste avslutas med ett nyradstecken.

  3. tbone är helt rätt raden TO_CHAR(10) är fel! Försök bara SELECT TO_CHAR(10) FROM DUAL; du får 10 som du sedan jämför med ett enda tecken. Ett enskilt tecken kommer aldrig att vara '10' eftersom 10 har två tecken!

  4. Ditt problem är troligen ett buffertspill med för stora XML-filer, men kom ihåg att även andra problem på målsystemet kan leda till skrivfel, som bör hanteras.

Lösningar

  • Quick &Dirty :Eftersom du ändå inte verkar bry dig om prestanda kan du bara stänga filen varje X byte och öppna den igen med A för append. Så lägg bara till i slingan:

    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;
    
  • Använd rätt verktyg för rätt jobb:UTL_FILE lämpar sig inte för att hantera komplexa data. Det enda användningsfallet för UTL_FILE är små nyradseparerade textrader. För allt annat bör du skriva RAW-bytes! (Vilket också ger dig kontroll över ENCODING, vilket för närvarande bara är en mini-vanilly-lucky-gissning)

  • Skriv en Java-lagrad-procedur med NIO-filkanaler - snabbt, säkert, trevligt... Men var försiktig, ditt program kan köras 10 gånger så snabbt!



  1. ORA-22905 - när du frågar en tabelltyp med en select-sats

  2. MySQL Injection - Använd SELECT-frågan för att UPPDATERA/TA DELETE

  3. Allvarligt fel påträffades under kommandoexekveringen. mysql-connector .net

  4. hur trimmar jag en inmatningsadress för e-post så att endast data innan @ matas in i databasen?