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

UTL_FILE.WRITE_ERROR når du kalder utl_file.put i en loop

  1. Send den Oracle-version, du bruger! Eller vi kan bare gætte rundt...

  2. 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.

  3. tbone er fuldstændig rigtig, linjen TO_CHAR(10) er forkert! Bare prøv SELECT TO_CHAR(10) FROM DUAL; du får 10 som du så sammenligner med et enkelt tegn. Et enkelt tegn vil aldrig være '10', da 10 har to tegn!

  4. 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!



  1. Hvordan forhindrer jeg MySQL i at duplikere hver kolonnes indtastning i returnerede arrays?

  2. Pivotbord med 3 borde

  3. php / SQL - udskriv mange ord 4 gange mellem hver 4 navne med mange betingelser

  4. Forbinder Heroku til RDS ved hjælp af MySql2