Domanda

Ho alcune immagini in un database informix, come un campo BLOB binario (jpg), come posso scrivere le immagini sul disco con un SQL?

È stato utile?

Soluzione

I dati sono memorizzati in un campo BYTE o BLOB?

Se i dati sono memorizzati in una colonna BLOB, è possibile utilizzare:

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

Se i dati sono memorizzati in una colonna BYTE, devi lavorare piuttosto intensamente. Se hai ESQL / C (ClientSDK) e un compilatore C sul tuo computer, ti consiglio di ottenere SQLCMD dal Software IIUG Archivia ed estrae il software. È necessario il set di ambienti Informix ed è necessario essere in grado di compilare programmi C. Quindi eseguire:

./configure --prefix=$HOME/bin

Non importa cosa specifichi come prefisso: devi solo eseguire lo script di configurazione.

Puoi quindi compilare tutto ( make ) oppure puoi semplicemente compilare il programma selblob ( make selblob ). Quel programma è ciò che chiamo una "vignetta"; un programma microscopico che mostra come selezionare un BLOB BYTE su disco. Tuttavia, è anche perfettamente funzionante; funzionerà praticamente con qualsiasi cosa tu ci lanci, o diagnostichi un errore.

Se il tuo database è chiamato prezioso , i dati byte sono in una tabella byte_table , la colonna che contiene i dati è byte_column , e il le colonne chiave primaria sono col1 (e il valore richiesto è 23 ) e col2 (e il valore richiesto è " Habeas Corpus " ), quindi puoi eseguire:

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

Questo scaricherà il valore byte nel file indicato.

Se non si dispone di un compilatore ESQL / C o C o dell'autorizzazione per usarli, la vita è più difficile. L'approccio più vicino è usare l'istruzione UNLOAD in DB-Access:

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

Questo creerà un file contenente un dump esadecimale del valore byte (2 byte per carattere). È quindi necessario postelaborare il file per convertire l'esagono in dati regolari. Si noti che se la colonna fosse una colonna TESTO anziché una colonna BYTE, non sarebbe necessaria alcuna conversione. Puoi usare uno script Perl abbastanza semplice per fare la conversione (a condizione che il file sia abbastanza piccolo da essere assorbito dalla memoria - devi lavorare di più se non è abbastanza piccolo):

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 condizione di lunghezza specifica ' > 1 "per gestire la nuova riga alla fine dei dati scaricati.

(Per "uvetta isterica", alias "ragioni storiche", chiamo ancora "tipi BLOB" BYTE e TEXT, anche se IDS 9.00 ha introdotto i nomi espliciti BLOB e CLOB per "BLOB intelligenti", una coppia leggermente diversa di tipi di dati con funzionalità approssimativamente corrispondenti - nel mio libro, sono tutti tipi di BLOB (lettere minuscole). Questo è il problema con i vecchi che hanno appreso sui BLOB BYTE e TEXT nel 1990, sei o più anni prima che fossero aggiunti BLOB e BLOB BLOB . In ogni caso, non esiste una buona terminologia ufficiale alternativa per i BLOB di vecchio stile; l'uso di "muti blob" non è politicamente corretto!)

Altri suggerimenti

È necessario scrivere un piccolo programma che interroghi il database e salvi i BLOB sul disco. La maggior parte dei database non ha alcuna idea di "aprire file su disco".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top