SqlLoader es un utilitario muy potente que viene incluido con el servidor de base de datos Oracle. ¿Para qué sirve? SqlLoader nos permite popular nuestras tablas en forma masiva a partir de datos contenidos en archivos externos a la base. Es muy pero muy útil en cargas iniciales de tablas, procesos de migración y procesamiento de interfaces entre distintos sistemas. SqlLoader también es una herramienta valiosa a la hora de "subir" archivos binarios a una base de datos Oracle. Precisamente de eso se trata este artículo. Pero antes de entrar en los detalles, viene bien hablar un poco acerca del tipo de dato BLOB . Cuando creamos tablas, debemos asignar un tipo de dato a cada columna. El tipo de dato determina la naturaleza de los valores que podrán ser insertados en dicha columna. Los tipos de datos con los que solemos encontrarnos son numéricos (NUMBER), caracteres (CHAR y VARCHAR2) y fechas (DATE). Pero existen muchos otros tipos de datos que vemos con menos frecuencia. Uno de ellos es el BLOB. Para comprender rápido el tipo de dato BLOB podemos descomponer su nombre en dos partes: B significa B inary LOB significa L arge OB ject , es decir objeto grande Entonces, en columnas cuyo tipo de datos es BLOB podemos almacenar "objetos binarios grandes". Por ejemplo, un archivo que contenga un libro electrónico. Ahora bien, ¿cómo hacemos para insertar un archivo binario grande en una tabla? Una respuesta posible es la que daremos en este artículo. Hoy veremos cómo subir archivos binarios grandes a nuestra base de datos Oracle de manera masiva. Para la demostración, subiremos libros electrónicos a nuestra base de datos Oracle. Nuestros archivos con libros electrónicos quedarán almacenados en una columna de tipo BLOB. Comencemos nuestra demostración creando la tabla de libros electrónicos: SQL> create table ebooks ( 2 titulo varchar2(50), 3 autor varchar2(50), 4 ebook blob) 5 / Table created. Veamos el directorio que contiene nuestros libros electrónicos: [oracle@localhost fernando]$ ls -lrt total 1308 -rwxrwxr-x. 1 oracle oracle 855518 Jan 24 06:46 A_sangre_fria.fb2 -rwxrwxr-x. 1 oracle oracle 482196 Jan 24 06:46 La_bestia_debe_morir.fb2 Nuestra tabla, no sólo contiene los archivos. Están también las columnas en donde debemos registrar el autor y título de la obra. SqlLoader requiere principalmente dos cosas: Los datos a subir. En nuesto caso los datos a subir están en varios archivos. Por un lado tendremos un archivo primario con los nombre de autores y títulos de las obras. Por otro lado tendremos varios archivos secundarios, uno por cada libro electrónico. Detalles de los datos a subir. En general, los detalles de los datos a subir se específican en un archivo de control que se lo suele llamar "archivo ctl". En dicho archivo se indica: Ubicación del archivo Nombre de la tabla en donde se insertarán los datos Descripción de cómo viene los datos dentro del archivo etc. Veamos el contenido de nuestro archivo archivo primario con los datos a subir: [oracle@localhost fernando]$ cat ebooks.txt Truman Capote,A sangre fria,A_sangre_fria.fb2 Nicholas Blake,La bestia debe morir,La_bestia_debe_morir.fb2 Nótese que, además del autor y título de la obra, está el nombre del archivo. El nombre del archivo, es el elemento que nos permitirá vincular nuestro archivo primario con los archivos secundarios de modo tal que SqlLoader asocie correctamente ambos archivos a la hora de insertar los datos. Repasemos los archivos secundarios: [oracle@localhost fernando]$ ls -lrt *fb2 total 1308 -rwxrwxr-x. 1 oracle oracle 855518 Jan 24 06:46 A_sangre_fria.fb2 -rwxrwxr-x. 1 oracle oracle 482196 Jan 24 06:46 La_bestia_debe_morir.fb2 Veamos ahora el contenido de nuestro archivo de control: [oracle@localhost fernando]$ cat ebooks.ctl load data infile 'ebooks.txt' into table ebooks fields terminated by ',' (titulo char(50), autor char(50), ubicacion_archivo filler char(200), ebook lobfile(ubicacion_archivo) terminated by EOF) En nuestro archivo de control especificamos que nuestros datos están en un archivo primario llamado ebooks.txt . Los datos deberán ser insertados en la tabla EBOOK. Dentro del archivo, los datos de cada columna están separados por comas. Y luego viene la parte importante: la especificación que permite vincular cada fila del archivo ebooks.txt con el archivo binario que contiene el libro electrónico: ubicacion_archivo filler char(200), ebook lobfile(ubicacion_archivo) terminated by EOF) Tenemos todo listo para la operación final: popular nuestra tabla con los datos de autores, titulos y libros electrónicos. Invoquemos a SqlLoader: [oracle@localhost fernando]$ sqlldr userid=fernando/fernando control=ebooks.ctl log=ebooks.log bad=ebooks.bad Mientras SQlLoader inserta los datos, nos va dejando información: SQL*Loader: Release 12.1.0.2.0 - Production on Sun Jan 24 07:14:08 2016 Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved. Path used: Conventional Commit point reached - logical record count 2 Table EBOOKS: 2 Rows successfully loaded. Check the log file: ebooks.log for more information about the load. [oracle@localhost fernando]$ SqlLoader me informa que se cargaron exitosamente las dos filas. Ahora accedamos a la base y veriquemos que salió todo bien: SQL> select titulo, autor, dbms_lob.getlength(ebook) tamano from ebooks / TITULO AUTOR TAMANO -------------------------------------------------- -------------------------------------------------- ---------- Truman Capote A sangre fria 855518 Nicholas Blake La bestia debe morir 482196 SQL> Perfecto! Tenemos nuestros libros electrónicos en nuestra base de datos. Hemos aprendido cómo utilizar SqlLoader para subir datos de tipo BLOB. Nos vemos!
↧