Informix データベースにバイナリ BLOB フィールド (jpg) としていくつかの画像があります。SQL を使用して画像をディスクに書き込むにはどうすればよいですか?
2 に答える
データは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ブロブをディスクに選択する方法を示す微視的なプログラム。ただし、完全に機能します。それはあなたがそれに投げたり、エラーを診断したりするものなら何でも動作します。
データベースが呼び出され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';
!
これにより、バイト値(1文字あたり2バイト)の16進ダンプを含むファイルが作成されます。次に、ファイルを後処理して、16進数を通常のデータに変換する必要があります。列がBYTE列ではなくTEXT列である場合、変換は必要ないことに注意してください。かなり単純な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の両方を「ブロブタイプ」と呼んでいます。大まかに対応する機能-私の本では、それらはすべてブロブ(小文字)タイプです。これは、BLOBおよびCLOBブロブが追加される6年以上前の1990年にBYTEおよびTEXTブロブについて学んだ老人の問題です。場合によっては、古いスタイルのブロブに適した代替の公式用語はありません。「ダムブロブ」を使用することは政治的に正しくありません!)
データベースにクエリを実行し、ブロブをディスクに保存する小さなプログラムを作成する必要があります。ほとんどのデータベースには、「ディスク上のファイルを開く」という概念がありません。