Как записать двоичный двоичный объект на диск в Informix - PullRequest
7 голосов
/ 18 сентября 2009

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

Ответы [ 2 ]

7 голосов
/ 21 сентября 2009

Данные хранятся в поле BYTE или 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 из IIUG Software Archive и распаковать программное обеспечение. Вам нужен набор среды Informix, и вы должны иметь возможность компилировать программы на Си. Затем запустите:

./configure --prefix=$HOME/bin

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

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

Если ваша база данных называется precious, байтовые данные находятся в таблице byte_table, столбец, содержащий данные, - byte_column, а столбцы первичного ключа - col1 (и требуемое значение * 1022. *) и 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 байта на символ). Затем вам нужно обработать файл, чтобы преобразовать гекс в обычные данные. Обратите внимание, что если столбец был столбцом TEXT, а не столбцом BYTE, преобразование не требуется. Вы можете использовать довольно простой 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' для работы с новой строкой в ​​конце выгруженных данных.

(Из-за «истерического изюма», то есть «исторических причин», я по-прежнему называю и BYTE, и TEXT «типами BLOB-объектов», хотя в IDS 9.00 введены явные имена BLOB и CLOB для «умных BLOB-объектов», немного другой пары типы данных с примерно соответствующей функциональностью - в моей книге все они являются типами BLOB-объектов (строчными буквами). Это проблема старых парней, которые узнали о BLTE-объектах и ​​TEXT-объектах в 1990 году, за шесть или более лет до добавления BLOB-объектов и BLOB-объектов. , В любом случае, нет хорошей альтернативной официальной терминологии для блобов старого стиля; использование «тупых пятен» не является политически корректным!)

0 голосов
/ 18 сентября 2009

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

...