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

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

2 ответов


хранятся ли данные в байте или поле BLOB?

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

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

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

./configure --prefix=$HOME/bin

не имеет значения что вы укажете в качестве префикса - вам просто нужно запустить скрипт configure.

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

если ваша база данных называется 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 байта на символ). Затем вам нужно обработать файл, чтобы преобразовать hex в обычные данные. Обратите внимание, что если столбец является текстовым столбцом, а не столбцом байтов, преобразование не потребуется. Вы можете использовать довольно простой скрипт 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 ' для работы с новой строкой в конце выгруженных данных.

(для "истерического изюма", он же "исторические причины", я по-прежнему называю и байт и текст "типами blob", хотя IDS 9.00 ввел явные имена BLOB и CLOB для "умных blobs", немного другая пара типов данных с примерно соответствующей функциональностью - в моей книге они все типы blob (нижний регистр). Вот в чем беда со стариками, которые узнали о байтовых и текстовых кляксах в 1990 году, за шесть лет или больше до того, как они были добавлены. В любом случае, нет хорошей альтернативной официальной терминологии для старых капель стиля; использование "тупых капель" не политкорректно!)


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