Insertar ficheros en Teradata como BLOBs con bteq

En un artículo anterior ya se explicaba cómo Insertar ficheros en Teradata como BLOBs usando Windows Scripting Host y OLEDB/ADO.

La historia venía de la necesidad de cargar ficheros en modo ‘batch‘ utilizando algún lenguaje y herramientas que lo permitieran. Por aquel entonces estaba trabajando intensamente con Teradata V2R6 y sus herramientas (Teradata Tools). Pero desde entonces Teradata ha mejorado tanto la una como las otras y a partir de la versión 12.00.00.02 de bteq (Basic Teradata Query) permite la carga de ficheros en columnas LOB (BLOB/CLOB).

La forma de hacerlo es bien fácil, pero la documentación de Teradata se encarga de disimularlo muy bien, ya que es bastante difícil acceder a los pocos detalles importantes del, por otra parte sencillísimo, proceso. Todo se basa en la utilización de ‘LOBCOLS’ y ‘AS DEFERRED’ con ‘IMPORT’, ‘USING’ y -si se quiere cargar varias filas de una vez- ‘REPEAT’.

Así pues, utilizaremos bteq con un comando ‘IMPORT’ que cargue un fichero en el que irá la información necesaria y con un ‘REPEAT USING’ llamaremos a un ‘INSERT’ que hará la carga.

Para la prueba, cargaremos tres ficheros mp3 que he extraído del CD de mi disco favorito: “The Lamb Lies Down On Broadway“, de Genesis, y los he guardado en un directorio del disco duro.

Primer paso: creamos la tabla que albergará los ficheros en BLOB:

BTEQ -- Enter your DBC/SQL request or BTEQ command:
CREATE SET TABLE MY_DB.PRUEBA_BLOB,
           NO FALLBACK,
           NO JOURNAL
           (
              NOM_FICHERO  VARCHAR(64) NOT NULL CHARACTER SET LATIN,
              BLOB_CONTENT BLOB(15M)       NULL
           )
           UNIQUE PRIMARY INDEX (NOM_FICHERO)
;

 *** Table has been created.
 *** Total elapsed time was 1 second.

Tenemos el directorio con los mp3:

C:\>DIR "Musica\Genesis\The Lamb Lies Down On Broadway I"
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: D059-3939

 Directorio de C:\Musica\Genesis\The Lamb Lies Down On Broadway I

21/10/2009  19:39              .
21/10/2009  19:39              ..
21/10/2009  19:31        11.636.864 01-The Lamb Lies Down on Broadway.mp3
21/10/2009  19:31        10.528.896 02-Fly on a Windshield.mp3
21/10/2009  19:31         1.327.232 03-Broadway Melody of 1974.mp3
21/10/2009  19:32         5.269.632 04-Cuckoo Cocoon.mp3
21/10/2009  19:32        19.839.104 05-In the Cage.mp3
21/10/2009  19:32         6.627.456 06-The Grand Parade of Lifeless Packaging.mp3
21/10/2009  19:32        13.715.584 07-Back in NYC.mp3
21/10/2009  19:33         5.339.264 08-Hairless Heart.mp3
21/10/2009  19:33         8.898.688 09-Counting Out Time.mp3
21/10/2009  19:33        12.630.144 10-Carpet Crawlers.mp3
21/10/2009  19:37        13.645.952 11-The Chamber of 32 Doors.mp3
              11 archivos    109.458.816 bytes
               2 dirs  36.818.722.816 bytes libres

así que generamos (con cualquier editor de texto, en mi caso Ultraedit 7.20) el fichero que usaremos con ‘IMPORT’: será un fichero de texto con dos campos: la ruta al fichero mp3 en el sistema de ficheros del equipo y el propio nombre del fichero:

C:\Musica\Genesis\The Lamb Lies Down On Broadway I1-The Lamb Lies Down On Broadway.mp3|01-The Lamb Lies Down On Broadway.mp3
C:\Musica\Genesis\The Lamb Lies Down On Broadway I2-Fly on a Windshield.mp3|02-Fly on a Windshield.mp3
C:\Musica\Genesis\The Lamb Lies Down On Broadway I3-Broadway Melody of 1974.mp3|03-Broadway Melody of 1974.mp3

Usamos el “pipe” (‘|’) como separador de campos, aunque podríamos haber utilizado cualquier otro.
Lo guardamos como:
C:\Procesos\CargarBLOBs\BTEQ\Prueba_BLOB.imp,
con lo que tenemos la “infraestructura” completa.

Ahora sólo resta el “script” para el bteq, que resulta ser algo tan sencillo como:

.IMPORT VARTEXT '|' LOBCOLS 1 FILE="C:\Procesos\CargarBLOBs\BTEQ\Prueba_BLOB.imp"
.REPEAT *
USING (blob_content BLOB AS DEFERRED, nom_fichero VARCHAR(64))
INSERT INTO MY_DB.PRUEBA_BLOB (NOM_FICHERO, BLOB_CONTENT)
VALUES (:nom_fichero, :blob_content);

Como dijimos antes, las palabras mágicas son ‘LOBCOLS’, que le dicen a bteq cuantas columnas del fichero ‘IMPORT’ son campos con el nombre de ficheros que irán a columnas BLOB, y ‘AS DEFERRED’ que, junto con el tipo BLOB, indican que el contenido del campo se cargará mandando el contenido del fichero desde el cliente a la base de datos Teradata y de forma separada al resto del registro (El contenido del fichero se enviará a Teradata en trozos de 64 Kb hasta que todo el fichero haya sido transmitido).

El resto es simplemente utilizar ‘REPEAT *’ para que se lea todo el fichero ‘IMPORT’ línea a línea y el ‘USING’ para “mapear” los campos a variables que se usarán en el ‘INSERT’.

BTEQ -- Enter your DBC/SQL request or BTEQ command:
.IMPORT VARTEXT '|' LOBCOLS 1 FILE="C:\Procesos\CargarBLOBs\BTEQ\Prueba_BLOB.imp"
 BTEQ -- Enter your DBC/SQL request or BTEQ command:
.REPEAT *
 BTEQ -- Enter your DBC/SQL request or BTEQ command:
USING (blob_content BLOB AS DEFERRED, nom_fichero VARCHAR(64))
INSERT INTO MY_DB.PRUEBA_BLOB (NOM_FICHERO, BLOB_CONTENT)
                       VALUES (:nom_fichero, :blob_content);
 *** Starting Row 0 at Mon Jan 25 11:53:27 2010

 *** Insert completed. One row added.
 *** Total elapsed time was 1 second.

 *** Insert completed. One row added.
 *** Total elapsed time was 2 seconds.

 *** Insert completed. One row added.
 *** Total elapsed time was 3 seconds.

 *** Warning: Out of data.
 *** Finished at input row 3 at Mon Jan 25 11:53:31 2010
 *** Total number of statements: 3,  Accepted : 3,  Rejected : 0

 *** Total elapsed time was 4 seconds.

 *** Total requests sent to the DBC = 3
 *** Successful requests per second =  0.750

Podemos contar las filas de la tabla:

BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT COUNT(1) FROM MY_DB.PRUEBA_BLOB;

 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

   Count(1)
-----------
          3

E incluso hacer un SELECT, en el que veremos una imagen hexadecimal de los bytes contenidos en la columna BLOB:

SELECT * FROM MY_DB.PRUEBA_BLOB
ORDER BY NOM_FICHERO;

 *** Query completed. 3 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

NOM_FICHERO                           BLOB_CONTENT
------------------------------------- ----------------------------------------------------
01-The Lamb Lies Down On Broadway.mp3 49443303000000000D7D545045310000000800000047656E6573
02-Fly on a Windshield.mp3            49443303000000001319545045310000000800000047656E6573
03-Broadway Melody of 1974.mp3        49443303000000001075545045310000000800000047656E6573

Saludos.

Carlos.

Anuncios

4 Responses to Insertar ficheros en Teradata como BLOBs con bteq

  1. PAul dice:

    Excelente Carlos !!!

  2. […] BLOB en Teradata como ficheros usando Windows Scripting Host y OLEDB/ADO. Hemos visto aquí y aquí cómo guardar ficheros en forma de BLOBs en la base de datos. Ambos métodos son sencillos […]

  3. Kunjal dice:

    Can u post the same in english version ?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: