Saltar al contenido

UTL_FILE | Trabajo con ficheros

A traves de este paquete «UTL_FILE» podemos trabajar con ficheros en Oracle.

Primero crearemos el directorio para trabajar. Tenéis que tener permisos para hacerlo:
create or replace directory DIR_TEST as ‘/usuarios/prueba’;

Si queréis borrarlo:

drop directory DIR_TEST;

Con esta select podréis ver todos los directorios creados:

select * from dba_directories;

OPERATIVA
Para trabajar con ficheros, es básico conocer la operativa de las dos operaciones más normalmente usadas.
ESCRITURA
1.     Declarar el descriptor
2.     Abrir el fichero con FOPEN de modo escritura
3.     Escribir los datos usando PUT, FPUT o PUT_LINE.
4.     Cerrar fichero FCLOSE

LECTURA
1.     Declarar el descriptor
2.     Declarar variable para almacenar datos
3.     Abrir el fichero con FOPEN de modo lectura.
4.     Leer datos con GET_LINE
5.     Cerrar fichero FCLOSE

FUNCIONES

1.    UTL_FILE.OPEN

· Se utiliza para abrir un fichero en modo determinado.
· Si es todo es correcto, devuelve un DESCRIPTOR diferente de NULL.
· Sintaxis:
Descriptor utl_file.file_type;
Descriptor := UTL_FILE.FOPEN (‘Path’,’Nombre_Fichero’,’modo’);

El Descriptor debe ser una variable de tipo UTL_FILE.FILE_TYPE previamente declarada.
PATH + Nombre Fichero. El Path debe existir.
· Modo.
      R: Lectura
      W: Lectura y escritura en modo reemplazar. Si el fichero existe lo borra, sino lo crea
      A: Lectura y escritura en modo añadir. Si el fichero no existe ? INVALID_OPERATION.

declare
descriptor utl_file.file_type;
fichero_cont varchar2(100);
begin
 descriptor := utl_file.fopen(’DIR_TEST’,’fichero_oracle.txt’,’w’);
 fichero_cont := ‘Creando el nuevo fichero ‘;
 utl_file.put_line(descriptor,fichero_cont);
 utl_file.fclose(descriptor);
end;
/

2. UTL_FILE.IS_OPEN

Devuelve TRUE si el descriptor de fichero está aún abierto.
Sintaxis:
auxiliar Boolean;
auxiliar := UTL_FILE.IS_OPEN(Descriptor);

3. UTL_FILE.GET_LINE

Lee una línea de DATOS del fichero especificado.
Se necesita una variable de salida (buffer_salida) lo suficientemente largo para almacenar todos los datos hasta el retorno de carro ( no incluido en buffer).
Sintaxis:

buffer_salida varchar2(2000); !! Tiene que ser mayor que cualquier línea de nuestro fichero.
UTL_FILE.GET_LINE(‘Descriptor’,buffer_salida); 

4. UTL_FILE.FCLOSE/FCLOSE_ALL

Se utiliza para el fichero abierto y asignado a ese descriptor.
Con FCLOSE_ALL se cierran todos los ficheros que estén en ese momento abiertos.
Si un programa acaba y existen ficheros abiertos, puede afectar al contenido de estos archivos.
Sintaxis:
UTL_FILE.FCLOSE(‘Descriptor’);
UTL_FILE.FCLOSE_ALL;

declare
descriptor utl_file.file_type;
salida varchar2(100);
fichero_cont varchar2(100);
auxiliar Boolean;
begin
       descriptor := utl_file.fopen(’DIR_TEST’,’fichero_oracle.txt’,’r’);
       utl_file.get_line(descriptor,salida);
       dbms_output.put_line(’ Contenido del fichero: ‘ || salida);
       auxiliar := UTL_FILE.IS_OPEN(descriptor);
       if auxiliar = TRUE then
         dbms_output.put_line(’ El fichero esta abierto ‘);
       else
         dbms_output.put_line(’ El fichero esta cerrado ‘);
       end if;
       UTL_FILE.FCLOSE(descriptor);
/* Para cerrar el fichero */
end;
/

Devolverá:

Contenido del fichero: Añadiendo al nuevo fichero

El fichero esta abierto

 

NO SE PUEDE LEER Y ESCRIBIR EN EL MISMO FICHERO A LA VEZ.

5. UTL_FILE.PUT

Se utiliza para escribir datos en un fichero.
Los datos se añaden a continuación de donde están situados.
No se añade el “ fin de línea “. Lo escribe a continuación de la última línea.
Sintaxis:
UTL_FILE.PUT(‘Descriptor’,buffer);

6. UTL_FILE.NEW_LINE

Se utiliza para añadir 1 o más saltos de línea al fichero.
Si el número pasado el menos o igual a cero no ocurre nada.
Sintaxis:
UTL_FILE.NEW_LINE(‘Descriptor’,’Numero lineas’);

7. UTL_FILE.PUT_LINE

Se utiliza para escribir datos (caracteres, fechas, números en un fichero, añadiendo al final un salto de línea.
Los datos se añaden a continuación de donde están situados.
Sintaxis:
UTL_FILE.PUT_LINE(‘Descriptor’,buffer);

8. UTL_FILE.PUTF

Se utiliza para escribir datos en un fichero con un formato determinado.
Los operador utilizados son idénticos a los utilizados en el lenguaje C (%s, \n…);
Sintaxis:
UTL_FILE.PUTF (‘Descriptor, formato, arg1, arg2,…);

9. UTL_FILE.FFLUSH

Se utiliza para escribir físicamente todos los datos pendientes de escritura
Todas las operaciones de escritura se hacen a través de buffers intermedios para rapidez del sistema.
Sintaxis:
UTL_FILE.FFLUSH(‘Descriptor’);

declare
descriptor utl_file.file_type;
datos_put varchar2(100);
datos_put_line varchar2(100);
auxiliar Boolean;
begin
descriptor := utl_file.fopen(’DIR_TEST’,’fichero_oracle.txt’,’w’);
   loop
       datos_put := ‘Esto es con el put’;
       utl_file.put(descriptor,datos_put);   –
Lo escribe todo seguido
       datos_put := ‘Continuacion del put’;
       utl_file.put(descriptor,datos_put);
       datos_put_line := ‘  Esto es put_line’;
       utl_file.put_line(descriptor,datos_put_line); 
       utl_file.new_line(descriptor,2);
       datos_put_line := ‘ Continuanos con el put_line’;
       utl_file.put_line(descriptor,datos_put_line);
    utl_file.fclose(descriptor);
    exit;
   end loop;
end;
/

FUNCIONES NUEVAS A PARTIR DE ORACLE 10g

– FCOPY. Copiar parte de un fichero a otro:

BEGIN
UTL_FILE.FCOPY (’C:\Ficheros’,’datos.txt’,
               ‘C:\Ficheros’,’copia_datos.txt’,1,5); — Es por línea, si quiero que copie todo elimino los parámetros. El fichero segundo no hace falta que exista y si existe lo reemplaza
end;
/

– FREMOVE. Borrar un fichero:

Si el último parámetro es TRUE y el fichero existe sobreescribe el fichero e ignora el error. Si existe y es FALSE da error. Si no existe no da error en ningún caso

BEGIN
 UTL_FILE.FREMOVE(’C:\Ficheros’,’prueba.txt’);
END;
/

– FRENAME. Renombrar un fichero:

BEGIN
  UTL_FILE.FRENAME(’C:\Ficheros’,’datos.txt’,’C:\Ficheros’,’nuevos_datos.txt’,false);
END;
/

– FGETPOS. Devuelve la posición en bytes donde nos encontramos:

DECLARE
v_datos varchar2(2000);
GET_POS NUMBER;
descriptor utl_file.file_type;
BEGIN
descriptor := utl_file.fopen(’c:\ficheros’,'datos.txt’,'r’);
  — No hemos hecho nada : devuelve 0
  GET_POS := UTL_FILE.FGETPOS (descriptor);
  dbms_output.put_line(get_pos);
 –Leemos una línea
 utl_file.get_line(descriptor,v_datos);
  GET_POS := UTL_FILE.FGETPOS (descriptor);
  dbms_output.put_line(get_pos);
utl_file.fclose(descriptor);
end;
/

– Función FSEEK. Sirve para posicionarnos en un byte determinado:

DECLARE
v_datos varchar2(2000);

descriptor utl_file.file_type;
BEGIN
descriptor := utl_file.fopen(’c:\ficheros’,'datos.txt’,'r’);

 –Nos posicionamos en el byte 16
 utl_file.fseek(descriptor,16);
 
 – Leemos la línea
 utl_file.get_line(descriptor,v_datos);

 dbms_output.put_line(v_datos);

utl_file.fclose(descriptor);
end;
/