Как записать двоичный двоичный объект на диск в Informix

StackOverflow https://stackoverflow.com/questions/1445191

  •  22-07-2019
  •  | 
  •  

Вопрос

У меня есть несколько изображений в базе данных informix в виде двоичного большого двоичного объекта (jpg), как я могу записать изображения на диск с помощью SQL?

Это было полезно?

Решение

Хранятся ли данные в байтовом или двоичном поле?

Если данные хранятся в столбце BLOB-объектов, то вы можете использовать:

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

Если данные хранятся в столбце БАЙТ, то вам придется потрудиться еще усерднее.Если у вас есть ESQL / C (ClientSDK) и компилятор C на вашем компьютере, то я рекомендую получить SQLCMD из Архив программного обеспечения IIUG и извлечение программного обеспечения.Вам нужна установленная среда Informix, и вы должны уметь компилировать программы на языке Си.Тогда беги:

./configure --prefix=$HOME/bin

Не имеет большого значения, что вы указываете в качестве префикса - вам просто нужно запустить скрипт configure.

Затем вы можете либо скомпилировать все (make), или вы можете просто скомпилировать программу selblob (make selblob).Эта программа - то, что я называю "виньеткой";микроскопическая программа, которая показывает, как выбрать большой двоичный объект в виде байта на диск.Однако он также полностью функционален;он будет работать практически со всем, что вы в него добавите, или диагностирует ошибку.

Если ваша база данных вызывается precious, байтовые данные находятся в таблице byte_table, столбец , содержащий данные , равен byte_column, а столбцами первичного ключа являются col1 (и требуемое значение равно 23) и col2 (и требуемое значение равно "Habeas Corpus"), после чего вы можете запускать:

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

Это выгрузит значение в байтах в именованный файл.

Если у вас нет ESQL / C или компилятора C или разрешения на их использование, то жизнь становится сложнее.Самый близкий подход заключается в использовании инструкции UNLOAD в DB-Access:

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

Это создаст файл, содержащий шестнадцатеричный дамп байтового значения (2 байта на символ).Затем вам необходимо выполнить постобработку файла, чтобы преобразовать шестнадцатеричное значение в обычные данные.Обратите внимание, что если бы столбец был ТЕКСТОВЫМ, а не БАЙТОВЫМ, то преобразование не потребовалось бы.Вы можете использовать довольно простой Perl-скрипт для преобразования (при условии, что файл достаточно мал, чтобы его можно было поместить в память - вам придется потрудиться, если он недостаточно мал):

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

Условие длины определяет '> 1'чтобы разобраться с новой строкой в конце выгруженных данных.

(Из "истерического изюма", он же "исторические причины", я по-прежнему называю как БАЙТ, так и ТЕКСТ "типами больших двоичных объектов", хотя IDS 9.00 ввел явные имена BLOB и CLOB для "интеллектуальных больших двоичных объектов", немного другой пары типов данных с примерно соответствующей функциональностью - в моей книге все они являются типами больших двоичных объектов (в нижнем регистре).В этом проблема со старыми ребятами, которые узнали о больших двоичных объектах типа BYTE и TEXT в 1990 году, за шесть или более лет до того, как были добавлены большие двоичные объекты типа BLOB.В любом случае, не существует хорошей альтернативной официальной терминологии для больших двоичных объектов старого стиля;использование "тупых двоичных объектов" неполиткорректно!)

Другие советы

Вам нужно написать небольшую программу, которая запрашивает базу данных и сохраняет большие двоичные объекты на диск. Большинство баз данных не имеют понятия «открыть файл на диске».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top