sql >> Base de Datos >  >> RDS >> Oracle

UTL_FILE.WRITE_ERROR al llamar a utl_file.put en un bucle

  1. ¡Publique la versión de Oracle que está utilizando! O simplemente podemos adivinar...

  2. Su fflush no funcionará como espera:de la documentación :

    FFLUSH escribe físicamente los datos pendientes en el archivo identificado por el identificador de archivo. Normalmente, los datos que se escriben en un archivo se almacenan en búfer. El procedimiento FFLUSH obliga a que los datos almacenados en el búfer se escriban en el archivo. Los datos deben terminar con un carácter de nueva línea.

  3. ¡Tbone tiene toda la razón, la línea TO_CHAR(10) está mal! Prueba SELECT TO_CHAR(10) FROM DUAL; obtendrás 10 que luego comparas con un solo personaje. ¡Un solo carácter nunca será '10' ya que 10 tiene dos caracteres!

  4. Lo más probable es que su problema sea un desbordamiento de búfer con archivos XML demasiado grandes, pero tenga en cuenta que también otros problemas en el sistema de destino pueden generar errores de escritura, que deben manejarse.

Soluciones

  • Rápido y Sucio :Dado que no parece importarle el rendimiento de todos modos, puede cerrar el archivo cada X byte y volver a abrirlo con A para agregar. Así que simplemente agregue al ciclo:

    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;
    
  • Utilice la herramienta adecuada para el trabajo adecuado:UTL_FILE no es adecuado para el manejo de datos complejos. El único caso de uso para UTL_FILE son pequeñas líneas de texto separadas por saltos de línea. ¡Para todo lo demás, debe escribir bytes RAW! (Lo que también le permitirá tener un control pormenorizado sobre la CODIFICACIÓN, que actualmente es solo una pequeña adivinanza).

  • Escriba un procedimiento almacenado en Java con NIO-Filechannels:rápido, seguro, agradable... ¡Pero tenga cuidado, su programa podría ejecutarse 10 veces más rápido!