2009-09-18 17 views

risposta

7

I dati sono memorizzati in un campo BYTE o BLOB?

Se i dati sono memorizzati in una colonna BLOB, quindi è 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, allora si deve lavorare piuttosto duro. Se si dispone di ESQL/C (ClientSDK) e un compilatore C sulla macchina, quindi si consiglia di ottenere SQLCMD dal IIUG Software Archive ed estrarre il software. È necessario il proprio set di ambienti Informix e si deve essere in grado di compilare programmi C. Quindi esegui:

Non ha molta importanza quello che viene specificato come prefisso: è sufficiente eseguire lo script di configurazione.

È quindi possibile compilare tutto (make) oppure è possibile 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 pienamente funzionale; funzionerà con qualsiasi cosa tu passi o diagnostichi un errore.

Se il database si chiama precious, il byte di dati è in una tabella byte_table, colonna che contiene i dati è byte_column, e le colonne chiave primaria sono col1 (e il valore richiesto è 23) e col2 (e il valore richiesto è "Habeas Corpus"), allora è possibile eseguire:

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

Questo scaricherà il valore di byte in un file nominato.

Se non si dispone del compilatore ESQL/C o C o del permesso per utilizzarli, la vita è più difficile. L'approccio più vicino è quello di utilizzare l'istruzione SCARICO nel 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 hex-dump del valore di byte (2 byte per carattere). È quindi necessario post-elaborare il file per convertire l'esadecimale in dati regolari. Si noti che se la colonna fosse una colonna TEXT anziché una colonna BYTE, non sarebbe necessaria alcuna conversione. È possibile utilizzare uno abbastanza semplice script in Perl per fare la conversione (a condizione che il file è abbastanza piccolo da essere slurped nella memoria - si deve 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 lunghezza specifica ' > 1 'per gestire la nuova riga alla fine dei dati non caricati.

(Per "hysterical raisins", alias "ragioni storiche", chiamo ancora sia "tipi di blob" BYTE e TEXT, anche se IDS 9.00 ha introdotto i nomi espliciti BLOB e CLOB per "smart blob", una coppia leggermente diversa di tipi di dati con funzionalità approssimativamente corrispondenti - nel mio libro, sono tutti tipi blob (minuscole). Questo è il problema con i vecchi che hanno imparato a conoscere i BLOB di BYTE e TEXT nel 1990, sei anni o più prima che BLOB e BLOB di BLOB fossero aggiunto. In ogni caso, non esiste una buona terminologia ufficiale alternativa per i vecchi BLOB di stile; non è politicamente corretto!)

+0

sei pazzo jon ... Avevo bisogno anche di questa risposta e ovviamente sarà la tua risposta se ha ottenuto qualcosa fare con informix – CheeseConQueso

+0

Apparentemente LOTOFILE funziona anche su colonne BYTE, almeno in Informix 12.10. Grazie per tutti gli utili post Informix, ogni volta che cerco qualcosa su Informix il tuo nome compare :) – Otherside

0

È necessario scrivere un piccolo programma che interroga il database e salva i BLOB sul disco. La maggior parte dei database non ha la nozione di "file aperto su disco".

+1

Credo di essere abituato a MySQL – levhita