2009-09-18 5 views

Répondre

7

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

Si les données sont stockées dans une colonne de type 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 de BYTE, alors vous devez travailler plus dur plutôt. Si vous avez ESQL/C (ClientSDK) et un compilateur C sur votre machine, alors je recommande d'obtenir SQLCMD à partir du IIUG Software Archive et d'extraire le logiciel. Vous avez besoin de votre environnement Informix et vous devez être capable de compiler des programmes C. Ensuite, exécutez:

./configure --prefix=$HOME/bin 

Il n'a pas beaucoup d'importance ce que vous spécifiez comme préfixe - il vous suffit de lancer le script de configuration.

Vous pouvez ensuite compiler tout (make), ou vous pouvez simplement compiler 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 le disque. Il est cependant aussi pleinement fonctionnel; il fonctionnera avec à peu près tout ce que vous lui lancerez ou diagnostiquerez une erreur.

Si votre base de données est appelée precious, les données octet est dans une table byte_table, la colonne contenant les données sont byte_column, et les colonnes de clé primaire sont col1 (et la valeur requise est 23) et col2 (et la valeur requise est "Habeas Corpus"), alors vous pouvez exécuter:

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

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

Si vous n'avez pas ESQL/C ou un compilateur C ou la permission de les utiliser, alors la vie est plus difficile. Le plus proche approche consiste à utiliser l'instruction UNLOAD dans DB-accès:

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

Cela va créer un fichier contenant un vidage hexadécimal de la valeur d'octet (2 octets par caractère). Vous devez ensuite post-traiter le fichier pour convertir l'hexagone en données régulières. 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 est assez petit pour être slurped en mémoire - vous devez travailler plus dur si elle 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 précise ' > 1 'pour traiter le retour à la ligne à la fin des données déchargées. (Pour 'Raisins hystériques', alias 'raisons historiques', j'appelle toujours les types blob BYTE et TEXT, même si IDS 9.00 a introduit les noms explicites BLOB et CLOB pour 'blobs intelligents', une paire légèrement différente Dans mon livre, ce sont tous des types blob (en minuscules) C'est le problème avec les vieux gars qui ont appris les blobs BYTE et TEXT en 1990, six ans ou plus avant BLOB et blobs CLOB étaient ajoutée. Dans tous les cas, il n'existe pas de bonne terminologie officielle alternative pour les taches de style plus anciennes; en utilisant 'blobs stupide' n'est pas politiquement correct!)

+0

vous êtes fou jon ... J'avais besoin de cette réponse aussi bien sûr et il va être votre réponse si elle a quelque chose à faire avec informix – CheeseConQueso

+0

Apparemment, LOTOFILE fonctionne aussi sur les colonnes BYTE, au moins dans Informix 12.10. Merci pour tous les messages utiles Informix, chaque fois que je cherche quelque chose sur Informix votre nom apparaît :) – Otherside

0

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".

+1

Je suppose que je suis habitué à MySQL – levhita

Questions connexes