-
Send den Oracle-version, du bruger! Eller vi kan bare gætte rundt...
-
Din
fflush
vil ikke fungere, som du forventer - Fra dokumentationen :FFLUSH skriver fysisk ventende data til filen identificeret af filhåndtaget. Normalt lagres data, der skrives til en fil. FLLUSH-proceduren tvinger de bufferlagrede data til at blive skrevet til filen. Dataene skal afsluttes med et linjeskifttegn.
-
tbone er fuldstændig rigtig, linjen TO_CHAR(10) er forkert! Bare prøv
SELECT TO_CHAR(10) FROM DUAL;
du får10
som du så sammenligner med et enkelt tegn. Et enkelt tegn vil aldrig være '10', da 10 har to tegn! -
Dit problem er højst sandsynligt et bufferoverløb med for store XML-filer, men husk, også andre problemer på målsystemet kan føre til skrivefejl, som bør håndteres.
Løsninger
-
Hurtig og beskidt :Da du alligevel ikke ser ud til at bekymre dig om ydeevne, kan du bare lukke filen hver X byte og genåbne den med A for at tilføje. Så bare føj til løkken:
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;
-
Brug det rigtige værktøj til det rigtige job:
UTL_FILE
er ikke egnet til at håndtere komplekse data. Den eneste usecase for UTL_FILE er små nylinjeseparerede tekstlinjer. For alt andet bør du skrive RAW bytes! (Hvilket også giver dig mulighed for at få kontrol over ENCODING, som i øjeblikket kun er mini-vanilly-lucky-guess) -
Skriv en Java-lagret-procedure med NIO-filkanaler - hurtigt, sikkert, godt... Men vær forsigtig, dit program kan køre 10 gange så hurtigt!