Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

UTL_FILE.WRITE_ERROR ao chamar utl_file.put em um loop


  1. Poste a Versão do Oracle que está usando! Ou podemos apenas adivinhar...

  2. Seu fflush não funcionará como você espera - Da documentação :

    FFLUSH grava fisicamente os dados pendentes no arquivo identificado pelo identificador de arquivo. Normalmente, os dados que estão sendo gravados em um arquivo são armazenados em buffer. O procedimento FFLUSH força os dados armazenados em buffer a serem gravados no arquivo. Os dados devem ser encerrados com um caractere de nova linha.

  3. tbone está absolutamente certo a linha TO_CHAR(10) está errada! Apenas tente SELECT TO_CHAR(10) FROM DUAL; você receberá 10 que você compara a um único caractere. Um único caractere nunca será '10', pois 10 tem dois caracteres!

  4. Seu problema provavelmente é um estouro de buffer com arquivos XML muito grandes, mas lembre-se de que outros problemas no sistema de destino podem levar a erros de gravação, que devem ser tratados.

Soluções


  • Rápido e sujo :Como você não parece se importar com o desempenho de qualquer maneira, basta fechar o arquivo a cada byte X e reabri-lo com A para anexar. Então, basta adicionar ao loop:
    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;
    

  • Use a ferramenta certa para o trabalho certo:UTL_FILE não é adequado para lidar com dados complexos. O único caso de uso para UTL_FILE são pequenas linhas de texto separadas por nova linha. Para todo o resto você deve escrever bytes RAW! (O que também permitirá que você controle porper sobre ENCODING, que atualmente é apenas um palpite de sorte)

  • Escreva um Java-Stored-Procedure com NIO-Filechannels - rápido, seguro, agradável... Mas cuidado, seu programa pode rodar 10 vezes mais rápido!