Frage

Ich habe einige Bilder in einer Informix-Datenbank, als binäres BLOB-Feld (jpg), wie kann ich die Bilder auf der Festplatte mit einem SQL schreiben?

War es hilfreich?

Lösung

Sind die gespeicherten Daten in einem Byte oder ein BLOB-Feld?

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

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 Rechner hat, dann empfehlen I erhalten SQLCMD aus der IIUG Software Archiv und die Software zu extrahieren. Sie benötigen Informix-Umgebung gesetzt, und Sie müssen in der Lage C-Programme zu kompilieren. Dann führen Sie:

./configure --prefix=$HOME/bin

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

Sie können dann entweder alles (make) kompilieren, oder Sie können einfach das Programm selblob (make selblob) kompilieren. Das Programm ist das, was ich eine ‚Vignette‘ nennen; ein mikroskopisches Programm, das zeigt, wie ein BYTE Klecks auf der Festplatte auszuwählen. Es ist jedoch auch voll funktionsfähig; es wird alles mit nur Arbeit, die Sie an ihn 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, der erforderlich ist "Habeas Corpus"), dann können Sie ausführen:

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

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

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

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

Das wird eine Datei mit einem Hex-Dump des Byte-Wert (2 Byte pro Zeichen) enthält. Anschließend müssen Sie die Datei nachbearbeiten die Hex in reguläre Daten zu konvertieren. Beachten Sie, dass, wenn die Spalte eine Spalte TEXT anstelle einer BYTE-Säule war, dann würde keine Konvertierung erforderlich. Sie können einen ziemlich einfachen Perl-Skript verwenden, um die Konvertierung zu tun (sofern die Datei klein genug ist, in dem Speicher zu geschlürft - 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‘ mit dem Newline am Ende der entladenen Daten befassen.

(für ‚hysterisch Rosinen‘, auch bekannt als ‚historische Gründe‘, rufe ich noch beide BYTE und TEXT ‚Blob-Typen‘, obwohl 9,00 IDS den expliziten Namen BLOB und CLOB für ‚intelligenten Blobs‘ eingeführt, ein etwas anderes Paar Datentypen mit Funktionalität entspricht ungefähr - in meinem Buch sind sie alle Blob (Kleinbuchstaben) Typen, die das Problem mit dem alten Jungs ist, wer über BYTE und TEXT Blobs im Jahr 1990 gelernt, sechs Jahre oder mehr vor BLOB und CLOB Blobs hinzugefügt wurden. . Auf jeden Fall gibt es keine gute Alternative offizielle Terminologie für die älteren Stil Blobs; 'Stummen Blobs' verwendet, ist nicht politisch korrekt!)

Andere Tipps

Sie benötigen ein kleines Programm zu schreiben, das die Datenbank abfragt und speichert die Kleckse auf der Festplatte. Die meisten Datenbanken haben keine Ahnung von „Open-Datei auf dem Datenträger“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top