El paquete (package) UTL_FILE nos va a permitir leer o escribir en ficheros del sistema operativo (Linux, Unix, Window, etc.) desde los programas que hagamos en PL/SQL en la base de datos Oracle. ¿Para que podemos necesitar leer o escribir en ficheros del sistemas operativo?, hay infinidad de de necesidades que podemos tener de cara a usar ficheros del sistema operativo, por ejemplo,
- Podemos escribir un procedimiento almacenado (PL/SQL) para volcar a un fichero de sistema operativo el contenido de una o varias tablas.
- Podemos implementar en nuestros procedimientos una rutina que escriba información de log, errores detectados, etc.
- Leer ficheros para realizar cargas personalizadas.
- Y muchas más funciones que seguro que tenéis en la cabeza.
Voy a explicar como usar los subprogramas principales de UTL_FILE para escribir una cadena en un fichero, añadir una cadena a un fichero y por último leer desde un fichero.
Antes de empezar con el desarrollo de un PL donde vamos a usar los subprogramas del paquete UTL_DIR tenemos que hacer dos cosas, la primera determinar el directorio de trabajo que vamos a usar en el sistema operativo, si no existe crearlo, y crear en la base de datos un objeto directory en la base de datos que no servirá para acceder al directorio del sistema operativo.
¿Quieres saber más sobre? “Como crear y administrar un objeto directory en Oracle”
Las funciones que voy a utilizar del paquete ULT_FILE son:
UTL_FILE.FOPEN() – Abrir un fichero
UTL_FILE.PUT() – Escribir en un fichero
UTL_FILE.GET_LINE() – Leer una línea de un fichero.
UTL_FILE.FCLOSE() – Cerrar un fichero.
1. Procedimiento almacenado para escribir en un fichero.
Paso a UTL_FILE.FOPEN() el nombre del objeto directorio, PRUEBA en este ejemplo, nombre del fichero, 'W' es el modo de apertura y la longitud máxima de la línea a escribir.
Con el modo de apertura W si el fichero no existe lo crea y si existe lo sobrescribe.
CREATE OR REPLACE PROCEDURE escribir_file IS
cadena VARCHAR2(32767);
file UTL_FILE.FILE_TYPE;
BEGIN
-- En este ejemplo escribo una cadena de caracteres en el fichero prueba.txt
-- Cadena a escribir
cadena := 'Prueba de escritura en fichero usando el paquete utl_file';
-- Abro fichero para escritura (Write)
file := UTL_FILE.FOPEN(‘PRUEBA','prueba.txt','W',256);
-- Escribo en el fichero
UTL_FILE.PUT(file,cadena);
-- Cierro fichero
UTL_FILE.FCLOSE(file);
dbms_output.put_line('Escritura correcta');
END;
/
Uso
SQL> SET SERVEROUTPUT ON
SQL> execute escribir_file;
Escritura correcta
2. Procedimiento almacenado para añadir a un fichero.
En esta caso paso a UTL_FILE.FOPEN() el modo de apertura ‘A’ para añadir, si el fichero existe añade la cadena, sino existe lo crea con el contenido de cadena.
CREATE OR REPLACE PROCEDURE anadir_file IS
cadena VARCHAR2(32767);
file UTL_FILE.FILE_TYPE;
BEGIN
-- En este ejemplo añado una cadena de caracteres al fichero prueba.txt
-- Cadena a escribir
cadena := 'Linea añadida a un fichero usando el paquete utl_file';
-- Abro fichero para añadir (Append)
file := UTL_FILE.FOPEN('PRUEBA','prueba.txt','A',256);
-- Escribo en el fichero
UTL_FILE.PUT(file,cadena);
-- Cierro fichero
UTL_FILE.FCLOSE(file);
dbms_output.put_line('Escritura correcta, información añadida');
END;
/
Uso
SQL> SET SERVEROUTPUT ON
SQL> execute anadir_file;
Escritura correcta, información añadida
3. Procedimiento almacenado para leer desde un fichero.
En esta caso paso a UTL_FILE.FOPEN() el modo de apertura ‘R’ para leer desde el fichero especificado.
CREATE OR REPLACE PROCEDURE leer_file IS
cadena VARCHAR2(32767);
Vfile UTL_FILE.FILE_TYPE;
BEGIN
-- En este ejemplo leo una linea del fichero prueba.txt
-- Abro fichero en lectura (Read)
Vfile := UTL_FILE.FOPEN('PRUEBA','prueba.txt','R',256);
-- Leo del fichero
UTL_FILE.GET_LINE(Vfile,cadena,32767);
-- Cierro fichero
UTL_FILE.FCLOSE(Vfile);
-- Muestro por partalla la linea
dbms_output.put_line(cadena);
END;
/
Uso
SQL> SET SERVEROUTPUT ON
SQL> execute leer_file;
Prueba de escritura en fichero usando el paquete utl_file