質問
Informixデータベースにバイナリblobフィールド(jpg)としていくつかの画像がありますが、SQLで画像をディスクに書き込むにはどうすればよいですか?
解決
データは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コンパイラがある場合、 IIUGソフトウェアからSQLCMDを取得することをお勧めします。アーカイブしてソフトウェアを抽出します。 Informix環境セットが必要であり、Cプログラムをコンパイルできる必要があります。次に、実行します:
./configure --prefix=$HOME/bin
プレフィックスとして何を指定するかは重要ではありません。configureスクリプトを実行するだけです。
すべてをコンパイル( make
)するか、単にプログラム selblob
( make selblob
)をコンパイルできます。そのプログラムは、私が「ビネット」と呼ぶものです。 BYTE 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コンパイラ、またはそれらを使用する許可がない場合、生活はより困難になります。最も近いアプローチは、DB-AccessでUNLOADステートメントを使用することです。
dbaccess precious - <<!
unload to "output_file"
select byte_column from byte_table where col1 = 23 and col2 = 'Habeas Corpus';
!
これにより、バイト値(文字ごとに2バイト)の16進ダンプを含むファイルが作成されます。その後、ファイルを後処理して、そのヘックスを通常のデータに変換する必要があります。列がBYTE列ではなくTEXT列である場合、変換は必要ないことに注意してください。かなり単純なPerlスクリプトを使用して変換を行うことができます(ファイルがメモリに丸toみできるほど小さい場合-十分に小さくない場合は一生懸命作業する必要があります):
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
長さの条件は '&gt;を指定します1
'を使用して、アンロードされたデータの最後の改行を処理します。
(「ヒステリックレーズン」、別名「歴史的理由」では、IDS 9.00が「スマートブロブ」の明示的な名前BLOBとCLOBを導入したにもかかわらず、BYTEとTEXTの両方を「ブロブタイプ」と呼んでいますが、ほぼ対応する機能を備えたデータ型-私の本ではすべてBLOB(小文字)型です。これは、BLOBとCLOB BLOBが追加される6年以上前の1990年にBYTEとTEXT BLOBについて学んだ老人たちの問題です。 いずれにせよ、古いスタイルのBLOBに適した代替の公式用語はありません。 「ダムブロブ」の使用は政治的に正しくありません!)
他のヒント
データベースにクエリを実行し、ブロブをディスクに保存する小さなプログラムを作成する必要があります。ほとんどのデータベースには、「ディスク上のファイルを開く」という概念がありません。