2009-09-18 6 views

Antwort

7

Sind die Daten in einem BYTE- oder einem BLOB-Feld gespeichert?

Wenn die Daten in einer BLOB-Spalte gespeichert ist, dann können Sie verwenden:

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

Wenn die Daten in einem Byte-Spalte gespeichert wird, dann haben Sie etwas härter zu arbeiten. Wenn Sie ESQL/C (ClientSDK) und einen C-Compiler auf Ihrem Computer haben, empfehle ich, SQLCMD von IIUG Software Archive zu erhalten und die Software zu extrahieren. Sie benötigen Ihre Informix-Umgebung, und Sie müssen in der Lage sein, C-Programme zu kompilieren. Führen Sie dann:

./configure --prefix=$HOME/bin 

Es ist nicht viel was Sie als Präfix angeben - Sie müssen nur das Configure-Skript ausführen.

Sie können dann entweder alles kompilieren (make), oder Sie kompilieren einfach das Programm selblob (make selblob). Dieses Programm nenne ich eine "Vignette"; ein mikroskopisches Programm, das zeigt, wie man einen BYTE-Blob auf Festplatte auswählt. Es ist jedoch auch voll funktionsfähig; Es funktioniert mit fast allem, was Sie darauf werfen oder einen Fehler diagnostizieren.

Wenn Ihre Datenbank precious genannt wird, ist die Byte-Daten in einer Tabelle byte_table, die Spalte die Daten hält, ist byte_column und die Primärschlüsselspalten sind col1 (und der Wert, der erforderlich ist 23) und col2 (und der Wert erforderlich "Habeas Corpus") ist, dann können Sie laufen:

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

Dadurch wird der Byte-Wert in der benannten Datei entladen.

Wenn Sie ESQL/C oder einen C-Compiler oder die Erlaubnis, sie zu verwenden, nicht haben, dann ist das Leben schwieriger. Der nächste Ansatz ist die UNLOAD-Anweisung in DB-Zugang zu nutzen:

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

Diese eine Datei erstellen, wird eine Hex-Dump des Byte-Wert (2 Byte pro Zeichen) enthält. Sie müssen dann die Datei nachbearbeiten, um das Hex in reguläre Daten zu konvertieren. Beachten Sie, dass keine Konvertierung erforderlich wäre, wenn es sich bei der Spalte um eine TEXT-Spalte anstelle einer BYTE-Spalte handelt. Sie können einen ziemlich einfachen Perl-Skript verwenden, um die Konvertierung zu tun (sofern die Datei klein genug ist, schlürfte in dem Speicher - Sie müssen härter arbeiten, wenn sie nicht klein genug sind):

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 

Die Länge Bedingung gibt ' > 1 ', um mit dem Zeilenumbruch am Ende der entladenen Daten umzugehen.

(Für 'hysterische Rosinen', auch 'historische Gründe' genannt, rufe ich immer noch 'Blob-Typen' von BYTE und TEXT an, obwohl IDS 9.00 die expliziten Namen BLOB und CLOB für 'Smart Blobs' eingeführt hat, ein etwas anderes Paar von Datentypen mit ungefähr entsprechender Funktionalität - in meinem Buch sind sie alle Blob (Kleinbuchstaben) Typen.Das ist das Problem mit alten Kerlen, die 1990 über BYTE und TEXT Blobs gelernt haben, sechs oder mehr Jahre bevor BLOB und CLOB Blobs waren hinzugefügt. In jedem Fall gibt es keine gute alternative offizielle Terminologie für die älteren Stil Blobs; "Dumm Blobs" ist nicht politisch korrekt!)

+0

Sie sind verrückt Jon ... Ich brauchte diese Antwort auch und natürlich wird es Ihre Antwort sein, wenn es etwas hat mit informix arbeiten – CheeseConQueso

+0

Anscheinend arbeitet LOTOFILE auch an BYTE-Spalten, zumindest in Informix 12.10. Danke für all die nützlichen Informix-Posts, jedes Mal, wenn ich etwas über Informix suche, erscheint Ihr Name :) – Otherside

0

Sie müssen ein kleines Programm schreiben, das die Datenbank abfragt und die Blobs auf Festplatte speichert. Die meisten Datenbanken haben keine Ahnung von "Datei auf Festplatte öffnen".

+1

Ich glaube, ich bin zu MySQL – levhita

Verwandte Themen