Guardar datos de columnas 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 y bastante flexibles (sobre todo comparándolos con la utilización del SQL Assistant).

Bien, ya tenemos nuestros ficheros en la base de datos, ¿Y ahora qué? ¿Qué pasa si queremos volver a recuperarlos como ficheros en nuestro sistema operativo? ¿Cómo hacemos si nos apetece volver a oir a Peter Gabriel, pero hemos olvidado el USB con los mp3 en casa y tenemos “The Lamb” en una columna BLOB de nuestra tabla?

BTEQ no será de mucha ayuda aquí: su funcionalidad a la hora de exportar LOBs es muy limitada. Pero no todo está perdido: Windows Scripting Host y OLEDB/ADO al rescate.

Recorriendo el camino inverso al que hicimos aquí, podemos -con unas pocas líneas de VisualBasic Script- tener el contenido de nuestros BLOBs de vuelta al sistema de ficheros (Ojo: Hay que acordarse de lo que dijimos de habilitar el tratamiento de LOBs mediante las ‘extended properties’ del OLEDB provider):

'Option Explicit
Option Explicit
'Constantes
Const OutDir = "C:\Basura"

'CommandTypeEnum
Const adCmdText = 1

'StreamTypeEnum
Const adTypeBinary = 1 'Indicates binary data.
Const adTypeText   = 2 'Default. Indicates text data, which is in the character set specified by Charset.

'Stream SaveOptionsEnum
Const	adSaveCreateNotExist	 =	1	'Default, creates	a new	file
Const	adSaveCreateOverwrite =	2	'Completely	overwrite data	in	an	existing	file

Const CONNECTIONSTRING = "Provider=TDOLEDB;Data Source=MY_TD;User Id=carlos;password=xxxxxxxx;Extended Properties=""EnableLOBSupport=Yes;"";" 'OLEDB EnableLOBSupport

Main

Sub Main
   Dim objConnection
   Dim objRecordset
   Dim objStream

   Wscript.Echo  Time & " Let's roll..."
   Set objConnection = WScript.CreateObject("ADODB.Connection")
   Set objRecordset = WScript.CreateObject("ADODB.RecordSet")
   Set objStream = CreateObject("ADODB.Stream")
   objConnection.ConnectionString = CONNECTIONSTRING
   objStream.Type = adTypeBinary
   Wscript.Echo "Conectando a Teradata..."
   objConnection.Open()
   objRecordset.ActiveConnection = objConnection
   objRecordset.Open "SELECT NOM_FICHERO, BLOB_CONTENT " & _
                       "FROM MY_DB.PRUEBA_BLOB " & _
                        "ORDER BY NOM_FICHERO"
   Do While Not objRecordset.EOF
      Wscript.Echo "Guardando " & objRecordset.Fields(0) & " como " & OutDir & "\" & objRecordset.Fields(0)
      objStream.Open
      objStream.Write objRecordset.Fields(1)
      objStream.SaveToFile OutDir & "\" & objRecordset.Fields(0), adSaveCreateOverWrite
      objStream.Close
      objRecordset.Move 1
   Loop
   'Close
   objRecordset.Close
   objConnection.Close
   'CleanUp
   Set objStream = Nothing
   Set objRecordset = Nothing
   Set objConnection = Nothing
   Wscript.Echo Time & " Bye."
End Sub

Lo ejecutamos:

C:\Procesos\CargarBLOBs>cscript Export_BLOB.vbs
Microsoft (R) Windows Script Host versión 5.6
Copyright (C) Microsoft Corporation 1996-2001. Reservados todos los derechos.

19:05:37 Let's roll...
Conectando a Teradata...
Guardando 01-The Lamb Lies Down On Broadway.mp3 como C:\Basura1-The Lamb Lies Down On Broadway.mp3
Guardando 02-Fly on a Windshield.mp3 como C:\Basura2-Fly on a Windshield.mp3
Guardando 03-Broadway Melody of 1974.mp3 como C:\Basura3-Broadway Melody of 1974.mp3
19:05:44 Bye.

C:\Procesos\CargarBLOBs>dir C:\Basura\
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: D059-3939

 Directorio de C:\Basura

26/01/2010  18:39              .
26/01/2010  18:39              ..
26/01/2010  19:05        11.636.864 01-The Lamb Lies Down On Broadway.mp3
26/01/2010  19:05        10.528.896 02-Fly on a Windshield.mp3
26/01/2010  19:05         1.327.232 03-Broadway Melody of 1974.mp3
               3 archivos     23.492.992 bytes
               2 dirs  36.883.800.064 bytes libres

C:\Procesos\CargarBLOBs>

Y voilà: en 7 segundos, ahí tenemos otra vez a Rael saliendo del metro en Times Square:

The Lamb En Winamp

The Lamb En Winamp

Saludos.

Carlos.

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: