Use SQL*Loader

1. Documentación en Tahiti -> Masters Book List -> Utilities -> Part II SQL*Loader

Documentación en Tahiti -> Masters Book List -> Utilities -> 7 SQL*Loader Concepts -> SQL*Loader Case Studies

2. SQL*Loader nos permite realizar cargas de datos desde archivos externos. Tiene un nivel de configuración muy elevado para poder tratar estructuras de datos bastante complejas. Afortunadamente para nosotros, en la documentación podemos revisar varios casos de estudio (Case Studies) en los que se muestran las distintas características de SQL*Loader. La documentación. Los ejemplos se encuentra en el directorio $ORACLE_HOME/rdbms/demo. Estos se instalan automáticamente co el asistente de instalación en el archivo “p10404530_112030_platform_6of7.zip”.

El procedimiento general para preparar este capítulo es leer los Conceptos de SQL*Loader y luego revisar y ejecutar cada ejemplo de los casos de estudio. Es bastante importante conocer que tenemos tres tipos de formato para los ficheros de entrada:

· Formato de Registro Fijo: Cada registro tiene un número fijo de bytes
· Formato de Registro Variable: El tamaño del registro se incluye al principio de cada uno
· Formato de Registro Stream: Formato de registro variable en el que se especifica el “terminador” del registro

Otras características importantes de SQL*Loader que debemos conocer es que se pueden combinar registros físcos para formar registros lógicos, también podemos leer LOBFILES, realizar conversión de tipos, …

3. Vamos a ejecutar varios casos de estudio. La primera parte consiste en preparar el usuario y los objetos para poder realizar la carga.

-- Primero tenemos que crear el usuario SCOTT
CREATE USER SCOTT IDENTIFIED BY "tiger" DEFAULT TABLESPACE USERS;
ALTER USER SCOTT QUOTA UNLIMITED ON USERS;
GRANT CONNECT, RESOURCE TO SCOTT;

-- Preparamos la BD para poder ejecutar el primer caso de estudio (ulcase1)
CONN scott/tiger
@?/rdbms/demo/ulcase1

Ahora ya podemos ejecutar SQL*Loader con el fichero de control del primer caso de estudio.

# Lanzamos SQL*Loader utilizando el fichero de control
# Nos movemos al directorio donde están los ejemplos de SQL*Loader
cd $ORACLE_HOME/rdbms/demo
# Mostramos el contenido del fichero ulcase1.ctl para ver lo que vamos a ejecutar
cat ulcase1.ctl
# Ejecutamos la carga teniendo en cuenta las siguientes consideraciones:
#   · "INFILE *" indica que los datos se encuentran en el propio fichero de control tras BEGINDATA
#   · Como no se indica el tipo de formato se asume que se trata de formato Stream
#   · Como no se indica el caracter de terminación de registro, se utiliza el retorno de carro
#   · Los campos están delimitados por ',' (FIELDS DELIMITED)
#   · El resto de parámetros es trivial y no procede su explicación
sqlldr USERID=scott CONTROL=ulcase1.ctl LOG=ulcase1.log

# Vamos con el segundo ejemplo
#   · Utilizamos un fichero externo para realizar la carga "INFILE 'ulcase2.dat'
#   · Para delimitar los campos se utiliza POSITION con la posición inicial y final del campo
#   · Fijaros en el tipo de datos de entrada es <formato> EXTERNAL (por ejemplo INTEGER EXTERNAL)
sqlldr USERID=scott/tiger CONTROL=ulcase2.ctl LOG=ulcase2.log

# El tercer ejemplo nos muestra como añadir datos a tabla EMP
# Primero requiere ejecutar el fichero ulcase3.sql
#   @?/rdbms/demo/ulcase3
# Ahora ya podemos ejecutar el ejemplo
#   · El parámetro APPEND nos permite añadir registros a la tabla EMP (INSERT es el parámetro por defecto)
#   · Si no usaramos APPEND no daría un error (SQL*Loader-601) ya que debe estar vacía por defecto
#   · Comprobamos como se introduce el formato de fecha "DD-Month-YYYY"
#   · El campo DPTNO es de tipo CHAR en el que se indica que acaba con la cadena ":"
#   · El ejemplo utiliza una secuencia para LOADSEQ comenzando con el máximo valor que haya en la columna + 1
sqlldr USERID=scott/tiger CONTROL=ulcase3.ctl LOG=ulcase3.log

# El cuarto ejemplo realiza una demostración de combinación de registros físicos en uno lógico
# Este ejemplo requiere de la ejecución del script ulcase4.sql
#   @?/rdbms/demo/ulcase4
# Ejecutamos el ejemplo
#   · El parámetro DISCARDFILE permite almacenar los registros que no cumplan el criterio de carga en un fichero
#   · EL parámetro DISCARDMAX especifica el número máximo de registros descartados antes de pasar a otro fichero
#   · REPLACE ejecute un "DELETE FROM TABLE" antes de la carga
#   · CONTINUEIF (1) = '*' especifica que cuando un registro comience con '*' se combine con el siguiente
sqlldr USERID=scott/tiger CONTROL=ulcase4.ctl LOG=ulcase4.log

# El quinto ejemplo demuestra como cargar datos en varias tablas en una sola ejecución
# Este ejemplo requiere de la ejecución del script ulcase5.sql
#   @?/rdbms/demo/ulcase5
# Ejecutamos el ejemplo
#   · Se utiliza REPLACE para borrar los datos de las tablas (EMP y PROJ) se borren primero
#   · Vemos que se cargan datos en las tablas EMP y PROJ con varios "INTO TABLE"
#   · Se utiliza una condición "WHEN PROJN != '   '"  para insertar el campo PROJN en varias posiciones distintas
sqlldr USERID=scott/tiger CONTROL=ulcase5.ctl LOG=ulcase5.log

# Se pueden cargas datos a traves de DIRECT PATH con una mejora considerable de rendimiento
# Este ejemplo requiere de la ejecución del script ulcase6.sql
#   @?/rdbms/demo/ulcase6
# Estos son los parámetros más destacados del ejemplo
#   · SORTED INDEXES aplica sólo a DIRECT PATH. Especificamos que los datos de origen ya están ordenados según el índice empix
#   · NULLIF nos permite insertar campos NULL cuando el registro de entrada se compone de espacios en blanco (blanks)
#   · Para utilizar DIRECT PATH debemos añadir el argumento DIRECT=TRUE
sqlldr USERID=scott/tiger CONTROL=ulcase6.ctl LOG=ulcase6.log DIRECT=TRUE

# El siguiente ejemplo es más complejo ya que utilizaremos un informe como la entrada de datos para SQL*Loader
# Este ejemplo requiere de la ejecución del script ulcase7s.sql
# Este script es muy importante ya que crea un TRIGGER para llenar ciertas columnas cuando están vacías
#   @?/rdbms/demo/ulcase7s
# Explicamos los parámetros destacados del ejemplo
#   · El parámetro WHEN sirve para identificar lineas con datos y descartar el resto
#   · La clausula "TRAILING NULLCOLS" identifica cada registro que falta como NULL
sqlldr USERID=scott/tiger CONTROL=ulcase7.ctl LOG=ulcase7.log
# Al final la ejecución debemos lanzar el siguiente script
#   @?/rdbms/demo/ulcase7s

# Cargaremos datos en una tabla particionada en el ejemplo ocho
# Este ejemplo requiere de la ejecución del script ulcase8.sql
#   @?/rdbms/demo/ulcase8
# Este ejemplo tiene tres apuntes diferentes al resto de ejercicios
#   · El formato de registro es fijo con 129 bytes por cada uno ("fix 129")
#   · El método de carga incluye un truncado de la tabla (TRUNCATE)
#   · PARTITION especifica en qué partición queremos cargar los datos. Llevamos todo a la partición "ship_q1"
sqlldr USERID=scott/tiger CONTROL=ulcase8.ctl LOG=ulcase8.log
# Como sólo se cumple la condición de la partición en 3 registros, sólo se insertan 3 filas
cat ulcase8.log

# También podemos cargar LOBFILE
# Este ejemplo requiere de la ejecución del script ulcase9.sql
#   @?/rdbms/demo/ulcase9
# Notas de esta prueba:
#   · El campo RES_FILE es de tipo FILLER, el cual se utiliza en el fichero de control pero no se carga en la tabla
#   · Dicho campo nos sirve para identificar el LOBFILE (RES_FILE) e introducirlo como CLOB en la tabla EMP
#   · Se ha entrecomillado la palabra "RESUME" porque es una palabra reservada de SQL*Loader y daría un error
sqlldr USERID=scott/tiger CONTROL=ulcase9.ctl LOG=ulcase9.log
# Una vez hayamos hecho la carga, podemos revisar que el campo CLOB se ha poblado correctamente
#   SET LONG 99999
#   SELECT * FROM EMP;

# Este ejemplo requiere de la ejecución del script ulcase10.sql
#   @?/rdbms/demo/ulcase10
# Este ejemplo es el más complicado de los que vamos a hacer
#   · Vemos como se combinar varios registros físicos en uno lógico (CONTINUEIF THIS (1) = '*')
#   · La clausula THIS sirve para indicar que la combinación de registros comienza con el actual
#   · Se realiza un REPLACE en las tablas CUSTOMERS y ORDERS
#   · En la tabla ORDERS se inserta el número de pedido, un REF hacia la tabla CUSTOMERS y un ITEM-LIST de varios elementos
#   · Es importante fijarse es como se utiliza FILLER en "cust_no" para rellenar el campo "cust"
sqlldr USERID=scott/tiger CONTROL=ulcase10.ctl LOG=ulcase10.log

# El último ejemplo nos demuestra como cargar datos que vienen en un juego de caracteres UTF16
# Este ejemplo requiere de la ejecución del script ulcase11.sql
#   @?/rdbms/demo/ulcase11
# Comentamos las clausulas específicas de este ejemplo
#   · Indicamos el juego de caracteres UTF16
#   · También especificamos el formato ENDIAN del archivo de entrada (BYTEORDER little)
#   · Para indicar los campos de terminación utilizamos códigos hexadecimales (Ej.: X'002c' = ',' o X'0022' = '"')
sqlldr USERID=scott/tiger CONTROL=ulcase11.ctl LOG=ulcase11.log