Pregunta

Tengo algunas imágenes en una base de datos informix, como un campo de blob binario (jpg), ¿cómo puedo escribir las imágenes en el disco con un SQL?

¿Fue útil?

Solución

¿Los datos se almacenan en un campo BYTE o BLOB?

Si los datos se almacenan en una columna BLOB, puede usar:

SELECT LOTOFILE(blob_column, '/path/to/file/on/client', 'client')
  FROM TheTable
 WHERE PK_Column = 23411   -- PK value

Si los datos se almacenan en una columna BYTE, entonces debe trabajar más duro. Si tiene ESQL / C (ClientSDK) y un compilador de C en su máquina, le recomiendo obtener SQLCMD del Software IIUG Archivar y extraer el software. Necesita su conjunto de entornos Informix y debe poder compilar programas en C. Luego ejecute:

./configure --prefix=$HOME/bin

No importa mucho lo que especifiques como prefijo, solo necesitas ejecutar el script de configuración.

Puede compilar todo ( make ) o simplemente compilar el programa selblob ( make selblob ). Ese programa es lo que yo llamo una 'viñeta'; Un programa microscópico que muestra cómo seleccionar un blob BYTE en el disco. Sin embargo, también es completamente funcional; funcionará con casi cualquier cosa que le arrojes o diagnostique un error.

Si su base de datos se llama precious , los datos de bytes están en una tabla byte_table , la columna que contiene los datos es byte_column , y el las columnas de clave principal son col1 (y el valor requerido es 23 ) y col2 (y el valor requerido es " Habeas Corpus " ), entonces puede ejecutar:

selblob -d precious -t byte_table -k col1=23 -k col2="Habeas Corpus" \
        -c byte_column -f output_file

Esto descargará el valor del byte en el archivo nombrado.

Si no tiene ESQL / C o un compilador de C o permiso para usarlos, entonces la vida es más difícil. El enfoque más cercano es usar la declaración UNLOAD en DB-Access:

dbaccess precious - <<!
unload to "output_file"
select byte_column from byte_table where col1 = 23 and col2 = 'Habeas Corpus';
!

Esto creará un archivo que contiene un volcado hexadecimal del valor de byte (2 bytes por carácter). Luego debe procesar posteriormente el archivo para convertir el hexadecimal en datos regulares. Tenga en cuenta que si la columna fuera una columna TEXTO en lugar de una columna BYTE, entonces no se necesitaría ninguna conversión. Puede usar una secuencia de comandos Perl bastante simple para realizar la conversión (siempre que el archivo sea lo suficientemente pequeño como para ser arrastrado a la memoria; debe trabajar más duro si no es lo suficientemente pequeño):

perl -w -e '
    $/ = "";
    my $data = <>;
    while (length($data) > 1)
    {
        my $hex = substr($data, 0, 2);
        printf "%c", hex($hex);
        $data = substr($data, 2);
    }' <output_file

La condición de longitud especifica ' > 1 'para tratar con la nueva línea al final de los datos descargados.

(Para 'pasas histéricas', también conocido como 'razones históricas', todavía llamo 'tipos de blob' de BYTE y TEXT, a pesar de que IDS 9.00 introdujo los nombres explícitos BLOB y CLOB para 'blobs inteligentes', un par ligeramente diferente de tipos de datos con una funcionalidad más o menos correspondiente: en mi libro, todos son tipos de blob (minúsculas). Ese es el problema con los viejos que aprendieron sobre blobs BYTE y TEXT en 1990, seis años o más antes de que se agregaran blobs BLOB y CLOB . En cualquier caso, no hay una buena terminología oficial alternativa para los blobs de estilo antiguo; ¡usar 'tontos blobs' no es políticamente correcto!)

Otros consejos

Debe escribir un pequeño programa que consulte la base de datos y guarde los blobs en el disco. La mayoría de las bases de datos no tienen la noción de "abrir archivo en el disco".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top