2011-08-26 46 views
5

Estoy escribiendo un archivo grande> 7MB desde un procedimiento almacenado de Oracle y los requisitos son no tener caracteres de terminación de línea (sin retorno de carro/avance de línea) al final de cada registro.Oracle PL/SQL UTL_FILE.PUT buffering

He escrito un procedimiento almacenado utilizando UTL_FILE.PUT y estoy siguiendo cada llamada a UTL_FILE.PUT con un UTL_FILE.FFLUSH. Este procedimiento produce errores con un error de escritura una vez que llego al punto en el que escribí más que el tamaño del búfer (establecido en 32767 como máximo) aunque estoy realizando las llamadas FFLUSH. El procedimiento funciona bien si reemplazo las llamadas PUT con llamadas PUT_LINE.

¿No es posible escribir más que el tamaño del búfer sin un carácter de nueva línea? ¿Si es así, hay alguna solución?

Respuesta

3

Dustin,

La documentación de Oracle aquí: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

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

La última oración es la más pertinente.

¿No podría escribir los datos usando UTL_FILE.PUT_LINE antes de buscar el archivo resultante para los terminadores de línea y eliminarlos?

Sólo un pensamiento ....

+0

Gracias por aclarar cómo funciona FFLUSH, no había visto la última frase en mis búsquedas. – Dustin

+0

Hola @Ollie, todavía estoy confundido acerca de cómo funciona FFLUSH, para (1 -> 32767 + n), cada vez que lo puse, y me descargo. ¿Por qué debería ser necesaria una nueva línea? ¿Me ayudarías a explicar? – Jaskey

4

cita borrado de documentos, véase la respuesta de Ollie

Otra posible manera de hacer esto es un procedimiento almacenado de Java, donde se puede utilizar la más completa herramienta API de Java para crear y escribir en archivos.

+0

buena idea con el procedimiento almacenado Java +1 – Ollie

+0

Estoy intrigado por el procedimiento almacenado java.Aunque creo que el código Java en sí sería sencillo, no hacemos ninguna codificación java en nuestra tienda, por lo que sería un problema de mantenimiento que alguien tenga que recoger. – Dustin

+0

¿Podría ayudarnos a explicar cómo podemos resolver este problema con el objeto BFILE? – Jaskey

0

Aunque es menos que deseable, siempre puede PUT hasta que haya detectado que se está acercando al tamaño del búfer. Cuando esto ocurre, puede FCLOSE manejar el archivo (vaciar el búfer) y volver a abrir ese mismo archivo con FOPEN usando 'a' (adjuntar) como modo. De nuevo, esta técnica generalmente se debe evitar, especialmente si otros procesos también intentan acceder al archivo (por ejemplo: cerrar un archivo generalmente revoca cualquier bloqueo que el proceso haya tenido sobre él, liberando cualquier otro proceso que intentara obtener un bloqueo).)

0

Gracias por todas las excelentes respuestas, han sido de gran ayuda. El procedimiento almacenado de Java parecía el camino a seguir, pero como no tenemos mucha experiencia en Java internamente, la gerencia no estaría bien visto. Pero, pude encontrar una manera de hacer esto desde el procedimiento almacenado. Tuve que abrir el archivo en el modo de escritura byte 'WB'. Luego, para cada registro que estoy escribiendo en el archivo, lo convierto al tipo de datos SIN PROCESAR con UTL_RAW.CAST_TO_RAW. Luego use UTL_FILE.PUT_RAW para escribir en el archivo seguido de las llamadas FFLUSH necesarias para vaciar los buffers. El sistema receptor ha podido leer los archivos; Hasta aquí todo bien.

Cuestiones relacionadas