lunes, 12 de marzo de 2012

Ejemplo de SQL*Loader

SQL*Loader es una herramienta de Oracle para cargar archivos de texto en una base de datos, por lo tanto podrías necesitar usarla algunas veces. Es muy fácil de usar y el siguiente ejemplo casi se explica solo.

Primero, tienes una tabla como esta en tu base de datos:

SQL> describe my_table
Name Null? Type
----------------------------------------- -------- ----------------------------
SOMEDATE DATE
FIELD1 VARCHAR2(256)
FIELD2 VARCHAR2(256)

Y quieres cargar datos como estos de archivos de texto plano:

08/10/2011|00:09:52|Some data|THRHTRDHF
08/15/2011|00:10:57|More data|NLHIJKUYJ
08/22/2011|00:11:00|This data|XEFGRGCG
08/26/2011|00:12:27|A lot of data|TVGT

Primero tienes que escribir un pequeño archivo de control para sqlldr, algo como esto:

LOAD DATA
APPEND
INTO TABLE my_table
FIELDS TERMINATED BY "|" TRAILING NULLCOLS
(
SOMEDATE "to_date(:SOMEDATE, 'MM/DD/YYYY HH24:MI:SS')",
FIELD1 ,
FIELD2
)

Aquí dices que quieres agregar datos a my_table, separados por |, y conviertes la fecha encontrada en los archivos de texto con la función to_date. Pero espera! Podrías haber notado que hay cuatro campos por línea y solo tres campos en la tabla; necesitas hacer un formateo básico de los archivos de texto antes de cargarlos con sqlldr.

Con este pequeño script el formateo y cargado de archivos es automatizado, y sólo necesitas ejecutarlo con el nombre del archivo de texto como parámetro para cargar el archivo:

conn="myuser/mypass@orcl"

cd /mydir/myloader
mknod loader.pipe p
cat $1|sed 's/|/ /' > loader.pipe &
sqlldr $conn skip=0 errors=999999999 data=loader.pipe control=loader.ctl log=loader.log bad=loader.bad
wait
rm loader.pipe

De esta forma colocas el script de cargado en /mydir/myloader, y el script crea una tubería nombrada para alimentar sqlldr con los datos formateados de sed como se ve a continuación:

08/10/2011 00:09:52|Some data|THRHTRDHF
08/15/2011 00:10:57|More data|NLHIJKUYJ
08/22/2011 00:11:00|This data|XEFGRGCG
08/26/2011 00:12:27|A lot of data|TVGT

Con un script puedes descomprimir archivos al vuelo o hacer transformaciones más complejas de archivos de texto antes de cargarlos, y en este caso le estás diciendo a sqlldr que cargue tantos registros como pueda ignorando errores (errors=999999999) y que escriba los registros malos a un archivo (bad=loader.bad).

Finalmente, correr este script se ve como esto:

oracle@myserver:~$ /mydir/myloader/loader /otherdir/file.txt

SQL*Loader: Release 11.1.0.7.0 - Production on Mon Sep 19 11:33:03 2011

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Commit point reached - logical record count 4

Más información:

SQL*Loader FAQ
SQL*Loader Command-Line Reference

No hay comentarios.:

Publicar un comentario