Archivo

Posts Tagged ‘utl_file’

Leer un archivo de texto mediante una consulta de BBDD

enero 12, 2010 13 comentarios

En Oracle existen las tablas externas que nos permiten vincular archivos de texto a tablas de base de datos. Este sistema es útil en numerosos casos, pero tiene el inconveniente que hay que declarar la estructura del archivo (columnas, separador, nulos…), tarea a menudo laboriosa. A veces sólo nos interesa poder consultar los datos de un archivo de forma ocasional. Vamos a detallar un método que nos permitirá leer mediante una consulta el contenido de un archivo sin necesidad de declarar tablas externas.

La solución propuesta consiste en la creación de una función que lee el archivo y devuelve el contenido de éste en un array. Para conseguir mejores resultados en el caso de archivos grandes, usaremos el método de las “pipelined table functions”, que nos permitirá ir devolviendo las líneas a medida que son leídas desde el archivo.

El primer paso será crear un tipo array de varchar2.

CREATE TYPE Ttb_archivo_texto AS TABLE OF VARCHAR2(4000);

A continuación creamos la función que lee el archivo. La función recibirá por parámetro el directorio de lectura y el nombre del archivo a leer. Devolverá el contenido del archivo en un array del tipo que acabamos de crear.

CREATE FUNCTION LEER_ARCHIVO (P_DIRECTORIO    VARCHAR2,
                              P_ARCHIVO       VARCHAR2
                             ) RETURN Ttb_archivo_texto PIPELINED AS
  vArchivo    utl_file.file_type;
  vLinea      varchar2(4000);
BEGIN
  vArchivo := utl_File.fopen (P_DIRECTORIO, P_ARCHIVO, 'R');

  -- Leemos cada una de las líneas del archivo y la retornamos
  Loop
    Begin
      utl_file.get_line (vArchivo, vLinea);
    exception
      when NO_DATA_FOUND then
        exit;
    end;

    Pipe row (vLinea);
  end loop;

  utl_file.fclose (vArchivo);

  return;
END;
/

Ya podemos usar la función en una consulta. Para ello, vamos a llamarla en la cláusula FROM utilizando la función pl/sql “table”:

Select COLUMN_VALUE
  from table (LEER_ARCHIVO ('OUT_SALDSV', 'test.txt'));

Nota: COLUMN_VALUE  es el nombre que recibe por defecto la columna devuelta por la función de tabla.

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 138 seguidores