Pequeña y practica explicacación de Sql Loader
El programa SQL*Loader
SQL*Loader es una potente utilidad de importación de datos que posibilita la carga automática de datos externos (residentes en ficheros del sistema operativo) en tablas de la base de datos. Los datos pueden cargarse en una o varias tablas que previamente deben estar creadas y que pueden o no tener contenido previo. Los nuevos datos podrán sustituir a los que ya existieran en las tablas o bien añadirse como nuevas filas.
Es posible la carga de datos almacenados en forma de ficheros de texto (lo más corriente) o binarios. La entrada del programa consiste en:
- Uno o varios ficheros de datos, con nombres por defecto terminados en .DAT, conteniendo los datos a importar.
- Un fichero (texto) de control, con nombre por defecto terminado en .CTL, que contiene órdenes que permiten guiar y particularizar el proceso de carga de datos. En este fichero se especifican los atributos de las tablas de la base de datos en los que se van a insertar los valores contenidos en el fichero de datos.
Como salida se generan hasta tres ficheros de texto:
- Un fichero de resultados, con nombre por defecto terminado en .LOG, que contiene diversos informes sobre la realización del proceso de carga de datos.
- Un fichero de errores, con nombre por defecto terminado en .BAD, que contiene aquellos datos del fichero de entrada que no han podido ser cargados en la base de datos por diversos errores. Si la carga se ha realizado sin errores entonces no se genera este fichero.
- Un fichero de descartados, con nombre por defecto terminado en .DSC, que contiene aquellos datos del fichero de entrada que no han sido cargados en la base de datos porque así se había especificado en el fichero de control. Si no se ha descartado ningún dato durante el proceso de carga no se genera este fichero.
La diferencia entre los datos erróneos y los descartados es que los primeros son aquellos datos que no han sido insertados en las tablas de la base de datos porque no han podido ser leidos correctamente desde el fichero de datos de entrada o bien su inserción causa errores de incumplimiento de restricciones definidas en las tablas, mientras que los datos descartados no se insertan en la base de datos porque no verifican una determinada condición que puede imponerse en el fichero de control, de manera que tan solo se inserten los datos que satisfacen dicha condición.
Un concepto importante a la hora de trabajar con SQL*Loader es el de registro físico y registro lógico. Suponiendo que el fichero de datos es de texto, un registro físico es una línea del fichero. Un registro lógico se corresponde con una fila o tupla de una tabla. La equivalencia entre estos dos tipos de registros puede ser cualquiera. Un registro físico puede dar lugar a varios registros lógicos de manera que cada lectura de una línea del fichero de entrada produce la escritura de varias filas en las tablas. Si por el contrario se necesitan varios registros físicos para formar un registro lógico, se necesitará leer varias líneas del fichero de datos antes de proceder a la inserción de una fila. El caso más sencillo y conveniente es cuando se produce la identidad entre ambos tipos de registro, en el cual cada lectura de una línea del fichero de datos puede generar una inserción en la base de datos.
Mediante la adecuada especificación del fichero de control puede programarse en cierta medida el proceso de carga de datos ya que se dispone de una cierta capacidad de especificación de condiciones para determinar si los datos leidos han de insertarse o no en la base de datos. La estructura del fichero de datos de entrada puede ser fija o secuencial. Es fija si los valores están dispuestos de forma invariable en posiciones determinadas del fichero de datos y secuencial si simplemente los valores están colocados uno a continuación del otro en cada línea del fichero y separados por un carárder determinado. En la práctica pueden existir ficheros cuya estructura presente características de los dos tipos.
No es obligatorio que los valores de todos los atributos o columnas del registro lógico aparezcan especificados en los campos del registro físico; se pueden leer todos o tan solo parte de los atributos. Los atributos cuyos valores no aparecen en el fichero de datos se insertan en las tablas con valores nulos.
Aunque el fichero de control permite una amplia gama de posibilidades para particularizar la carga de datos a las características del fichero de entrada, puede ser necesario o conveniente preprocesar los datos (por ejemplo, en un editor de texto) eliminando datos innecesarios, contenidos redundantes, etc. Si los datos a ser cargados están ordenados según algún atributo o combinación de atributos entonces se puede aprovechar esta circunstancia para acelerar el proceso.
Es muy interesante la posibilidad de insertar valores a determinados atributos de las tablas automáticamente, sin necesidad de especificar dichos valores en el fichero de datos. Por ejemplo se puede tener un atributo en una tabla cuyo valor se vaya incrementando en una cantidad fija cada vez que se inserta una fila en esa tabla, o bien el valor a insertar para ese atributo es constante para cada fila insertada.
Para ejecutar SQL*Loader se necesita especificar el nombre y palabra clave en el sistema Oracle de un usuario (usualmente el propietario) que disponga de permiso de inserción (INSERT) sobre las tablas en las que se van a cargar los datos. En la invocación del programa se ha de especificar el fichero de datos a procesar y el fichero de control, de la siguiente manera:
|
sqlload usuario/palabra_clave CONTROL=fichero_control, DATA=fichero_datos
|
Carga de los datos
En primer lugar se define en SQL*Plus una tabla en la cual insertar la información contenida en el fichero de datos sevilla.dat.
CREATE TABLE poblacion(
num NUMBER(3) PRIMARY KEY,
nombre CHAR(30) NOT NULL,
hombres NUMBER(6) NOT NULL,
mujeres NUMBER(6) NOT NULL); |
En esta tabla se almacena el nombre de cada municipio y su población masculina y femenina junto con un número de orden secuencial para cada municipio.
En este caso existe una identidad clara uno a uno entre registro físico y registro lógico. Veamos la forma de obtener el valor a insertar para cada fila de la tabla.
La redacción del fichero de control requiere utilizar un editor de texto, por ejemplo emacs. En nuestro caso se redactará el archivo carga.ctl con el siguiente contenido:
Los tipos de datos especificados en el fichero de control se refieren a los datos almacenados en el fichero de datos y no a los atributos correspondientes de la tabla donde se van a cargar.
Una vez que ya se dispone del fichero de datos, del fichero de control y de las tablas donde se van a insertar los datos puede iniciarse el proceso de carga datos mediante la invocación del programa SQL*Loader:
La información más interesante especificada en el archivo de resultados es el número total de filas insertadas en la base de datos. Puede comprobarse que la información ha sido realmente insertada en la tabla realizando una consulta desde SQL*Plus.