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.