Pergunta

Eu tenho algumas imagens em um banco de dados Informix, como um campo binário blob (jpg), como posso gravar as imagens para o disco com um SQL?

Foi útil?

Solução

Os dados são armazenados em um byte ou um campo BLOB?

Se os dados são armazenados em uma coluna BLOB, então você pode usar:

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

Se os dados são armazenados em uma coluna BYTE, então você tem que trabalhar um pouco mais difícil. Se você tem ESQL / C (ClientSDK) e um compilador C em sua máquina, então eu recomendo obtenção SQLCMD do IIUG Software Arquivo e extrair o software. Você precisa do seu conjunto ambiente Informix, e você precisa ser capaz de compilar programas em C. Em seguida, execute:

./configure --prefix=$HOME/bin

Não importa muito o que você especificar como o prefixo -. Você só precisa executar o script configure

Você pode então compilar tudo (make), ou você pode simplesmente compilar o selblob programa (make selblob). Esse programa é o que eu chamo de um 'vinheta'; um programa microscópico que mostra como selecionar uma bolha BYTE no disco. É, no entanto, também totalmente funcional; ele vai trabalhar com praticamente qualquer coisa que você jogue com ele, ou diagnosticar um erro.

Se o seu banco de dados é chamado precious, os dados byte está em uma byte_table tabela, a coluna mantendo os dados são byte_column, e as colunas de chave primária são col1 (eo valor exigido é 23) e col2 (e os é o valor necessário "Habeas Corpus"), então você pode executar:

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

Isto irá descarregar o valor de byte no arquivo chamado.

Se você não tem ESQL / C ou um compilador C ou permissão para usá-los, então a vida é mais difícil. A aproximação é usar a instrução descarregar no DB-Access:

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

Isto irá criar um arquivo contendo uma hex-dump do valor byte (2 bytes por caractere). Você precisa então de pós-processo o arquivo para converter o hex em dados regulares. Observe que, se a coluna era uma coluna de texto em vez de uma coluna BYTE, então seria necessária nenhuma conversão. Você pode usar um script bastante simples Perl para fazer a conversão (desde que o arquivo é pequeno o suficiente para ser sugado para a memória - você tem que trabalhar mais, se não é pequeno o suficiente):

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

A condição especifica comprimento > 1 '' para lidar com a nova linha no final dos dados descarregados.

(Para 'passas histéricas', aka 'razões históricas', eu ainda chamam tanto BYTE e TEXT 'tipos blob', embora IDS 9,00 introduziu a nomes BLOB e CLOB explícito para 'blobs inteligentes', um par ligeiramente diferente de tipos de dados com a funcionalidade que corresponde aproximadamente - no meu livro, eles são todos os tipos blob (minúsculas) Esse é o problema com caras mais velhos que aprenderam sobre BYTE e TEXT blobs em 1990, seis anos ou mais antes de BLOB e CLOB blobs foram adicionados. . Em qualquer caso, não há uma boa terminologia oficial alternativa para as bolhas de estilo mais velhos; usando 'blobs mudos' não é politicamente correto!)

Outras dicas

Você precisa escrever um pequeno programa que consulta o banco de dados e salva os blobs para o disco. A maioria dos bancos de dados não têm noção de "arquivo aberto no disco".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top