-
Lägg upp Oracle-versionen du använder! Eller så kan vi bara gissa runt...
-
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.
-
tbone är helt rätt raden TO_CHAR(10) är fel! Försök bara
SELECT TO_CHAR(10) FROM DUAL;
du får10
som du sedan jämför med ett enda tecken. Ett enskilt tecken kommer aldrig att vara '10' eftersom 10 har två tecken! -
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!