• Categoría: Oracle
  • Visto: 117087

Ratio: 4 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio desactivado
 
Oracle

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