2009-09-18 37 views

Respuesta

7

¿Los datos están almacenados en un campo BYTE o BLOB?

Si los datos se almacenan en una columna BLOB, a continuación, puede utilizar:

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 usted tiene que trabajar más duro. Si tiene ESQL/C (ClientSDK) y un compilador de C en su máquina, entonces le recomiendo que obtenga SQLCMD del IIUG Software Archive y extraiga el software. Necesita su conjunto de entorno Informix, y necesita poder compilar programas C. Luego ejecute:

./configure --prefix=$HOME/bin 

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

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

Si su base de datos se llama precious, el byte de datos está en una tabla byte_table, la columna que tiene los datos son byte_column, y las columnas de clave principal son col1 (y el valor requerido es 23) y col2 (y el valor necesario "Habeas Corpus" es), entonces se 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 de byte en el archivo identificado.

Si no tiene un compilador de ESQL/C o C o permiso para usarlos, entonces la vida es más difícil. La máxima aproximación es utilizar la instrucción de descarga de 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 del byte (2 bytes por carácter). Luego necesita procesar el archivo para convertir el hexadecimal en datos regulares. Tenga en cuenta que si la columna era una columna TEXTO en lugar de una columna BYTE, entonces no se necesitaría ninguna conversión. Puede utilizar una bastante simple script en Perl para hacer la conversión (siempre que el archivo es lo suficientemente pequeño para ser sorbido en la memoria - que tiene que 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 las "pasas histéricas", también conocidas como "razones históricas", sigo llamando a los "tipos de blobs" BYTE y TEXT, aunque IDS 9.00 introdujo los nombres explícitos BLOB y CLOB para "smart blobs", un par ligeramente diferente de tipos de datos con una funcionalidad aproximadamente equivalente: en mi libro, todos son tipos blob (minúsculas). Ese es el problema con los viejos que aprendieron blobs de BYTE y TEXT en 1990, seis años o más antes de que los blobs BLOB y CLOB fueran adicional. En cualquier caso, no hay una buena terminología oficial alternativa para los blobs de estilo antiguo; ¡Usar 'blobs tontos' no es políticamente correcto!)

+0

Estás loco jon ... Necesitaba esta respuesta también y por supuesto que va a ser tu respuesta si tiene algo hacer con informix – CheeseConQueso

+0

Aparentemente LOTOFILE también funciona en columnas BYTE, al menos en Informix 12.10. Gracias por todas las útiles publicaciones de Informix, cada vez que busco algo en Informix, aparece tu nombre :) – Otherside

0

Necesita 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 noción de "abrir archivo en el disco".

+1

Supongo que estoy acostumbrado a MySQL – levhita

Cuestiones relacionadas