Question

J'ai des images dans une base de données informix, sous la forme d'un champ de blob binaire (jpg), comment puis-je écrire les images sur le disque avec un code SQL?

Était-ce utile?

La solution

Les données sont-elles stockées dans un champ BYTE ou BLOB?

Si les données sont stockées dans une colonne BLOB, vous pouvez utiliser:

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

Si les données sont stockées dans une colonne BYTE, vous devez travailler plus fort. Si vous avez ESQL / C (ClientSDK) et un compilateur C sur votre machine, je vous recommande d’obtenir SQLCMD à partir du logiciel IIUG. Archiver et extraire le logiciel. Vous avez besoin de votre ensemble d’environnement Informix et vous devez être capable de compiler des programmes C. Puis lancez:

./configure --prefix=$HOME/bin

Peu importe ce que vous spécifiez comme préfixe - il vous suffit d'exécuter le script de configuration.

Vous pouvez ensuite tout compiler ( make ) ou simplement le programme selblob ( make selblob ). Ce programme est ce que j'appelle une "vignette"; un programme microscopique qui montre comment sélectionner un blob BYTE sur un disque. Cependant, il est également entièrement fonctionnel; cela fonctionnera avec à peu près tout ce que vous lui lancerez ou diagnostiquerez une erreur.

Si votre base de données s'appelle précieux , les données d'octet sont dans une table octet_table , la colonne contenant ces données est octet_colonne et les colonnes de clé primaire sont col1 (et la valeur requise est 23 ) et col2 (et la valeur requise est " Habeas Corpus " ), vous pouvez alors exécuter:

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

Ceci déchargera la valeur d'octet dans le fichier nommé.

Si vous ne disposez pas du compilateur ESQL / C ou C ou de l'autorisation de les utiliser, la vie est plus difficile. L’approche la plus proche consiste à utiliser l’instruction UNLOAD dans DB-Access:

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

Ceci créera un fichier contenant une copie hexadécimale de la valeur d'octet (2 octets par caractère). Vous devez ensuite post-traiter le fichier pour convertir l'hex en données standard. Notez que si la colonne était une colonne TEXT au lieu d'une colonne BYTE, aucune conversion ne serait nécessaire. Vous pouvez utiliser un script Perl assez simple pour effectuer la conversion (à condition que le fichier soit suffisamment petit pour être inséré dans la mémoire - vous devez travailler plus fort s'il n'est pas assez petit):

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 condition de longueur spécifie ' > 1 'pour traiter la nouvelle ligne à la fin des données déchargées.

(Pour les "raisins secs hystériques", aussi appelés "raisons historiques", j’appelle toujours les types de blob BYTE et TEXT, même si IDS 9.00 a introduit les noms explicites BLOB et CLOB pour "smart blobs", une paire de Les types de données avec une fonctionnalité approximative correspondante - dans mon livre, ce sont tous des types blob (minuscules). C'est le problème des vieux gars qui ont découvert les blobs BYTE et TEXT en 1990, six ans ou plus avant l'ajout des blobs BLOB et CLOB. . Dans tous les cas, il n’existe pas de bonne terminologie officielle alternative pour les blobs de style ancien; l'utilisation de 'blobs idiots' n'est pas politiquement correcte!)

Autres conseils

Vous devez écrire un petit programme qui interroge la base de données et enregistre les blobs sur le disque. La plupart des bases de données n’ont aucune notion de "fichier ouvert sur le disque".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top