El objetivo de del uso de las tablas externas es otorgar una alternativa al uso del SQL Loader o de la UTL FILE para la lectura de archivos planos. En muchos lugares la carga de información, sobre todo cuando se trata de grandes volúmenes, se efectúa por medio de un archivo plano que por lo general es generado por algún sistema satélite. Con las tablas externas se pueden seleccionar datos de archivos con los mismos comandos con los cuales seleccionamos datos de tablas de la base de datos. Sobre estas no se pueden crear índices o ejecutar cualquier sentencia del tipo DML (UPDATE, INSERT, o DELETE). Esto se puede hacer casi tan simple como poner un archivo en un directorio y hacer un “SELECT” de dicho archivo.
Pasos para la creación de una tabla externa.
- En primer lugar debemos crear el directorio para los archivos.
- El directorio debe existir y con el usuario SYS se debe correr el siguiente comando.
- CREATE OR REPLACE DIRECTORY nombre_directorio AS 'C:\path\';
- Haciendo un query a la DBA_OBJECTS podemos encontrar un objeto del tipo DIRECTORY con el nombre que le hayamos puesto.
- Una vez creado el directorio debemos poner el archivo que contiene la información en dicho directorio.
- Ahora es hora de crear la tabla que vinculará el contenido del archivo con el motor de base de datos.
CREATE TABLE nombre_tabla
(nombre_campo1 NUMBER(4),
nombre_campo1 VARCHAR2(25),
nombre_campo1 date)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY nomre_directorio
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
skip 1
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
REJECT ROWS WITH ALL NULL FIELDS)
LOCATION ('archivo_plano.dat'))
REJECT LIMIT UNLIMITED;
El REJECT LIMIT UNLIMITED especifica que no hay límite en el número de errores durante la carga del archivo a la tabla.
Nota: En este ejemplo usamos un archivo que se llama “archivo_plano.dat” con tres columnas con un terminador de línea que esta implícito en el NEWLINE y un separador de campos que es el caracter “,”.
Una vez generada la tabla se puede hacer un insert a otra tabla para poder contener los datos que necesitemos dentro de la base de datos.
- INSERT INTO nombre_tabla_int... SELECT * FROM nombre_tabla_ext;