SQL表から画像を取得する
このシリーズの「パート1」の記事では、IFSから画像を、BLOBデータ型として定義された列を持つ表へロードする方法について説明しました。BLOBは Binary Large Object を略したものであり、データベースに単一のエンティティーとして格納されるバイナリー データのコレクションです。
この記事の最終的な目的は、「パート1」でロードした画像を表から取り出し、それらをIFSへ書き戻すことです。このタスクが完了すると、「パート1」で使用したのと同じ5つの画像が出来ます。ごっちゃにならないように、IFS内の別のフォルダーに画像を書き込むようにします。フォルダー名は「 photos_out」とします。 この記事で使用されているコードは、 ここからダウンロードできます。 Photo_loco表には、画像の書き込み先とするIFSフォルダーの場所が格納されています。次のような表になります。
プログラムはまず、画像の書き込み先とする場所をPhotoOutputLocation変数にロードするGetOutputLocationサブルーチンを実行することから始まります。 Begsr GetOutputLocation;
// 写真の書き込み先とするIfsフォルダーを取得します。
ProcessPhotosサブルーチンは、「Photos」表をループして画像をIFSに書き込みます。確認のため、「パート1」でロードしたPhotos表を以下に示します。
Begsr ProcessPhotos;
// Ifsへ書き込みたい写真が格納されている表を読み取ります。
// エラー処理を実行します。
このサブルーチンでは、表から行を取り出すためにカーソルを宣言してオープンします。必要なのは、処理したい写真の名前だけです。名前はNameOfPhotoフィールドで示されます。写真の名前を取り出して、PhotoDsというデータ構造に入れます。
// - - - -
// 写真の場所のデータ構造です。
この例をシンプルにしておくために、エラー処理については一切コーディングしませんでしたが、コーディングする場合にどこに入るかを示しておきました。読み出す行ごとに、WritePhotosToIfsサブルーチンを実行します。このサブルーチンにはあまり多くのコードは含まれていませんが、多くの処理が行われるため、どのような処理が行われるのか理解しておくことが重要です。
SQL selectステートメントを始める前に、Photo_out_FO、Photo_out_NAME、およびPhoto_out_NLフィールドがどこから来るかについて確認して理解しておくことが重要です。このプログラムでは、SQL_type(BLOB_file)データ型で定義されるPhoto_outという変数を定義しています。
dcl-s Photo_out sqltype(Blob_file);
プログラムがコンパイルされると、SQLプリコンパイラーはPhoto_outを以下のフォーマットでデータ構造に変換します。
// SQLTYPE(BLOB_FILE)定義は、コンパイラーによって
// 以下のデータ構造に変換されます。
これらのそれぞれの意味を詳しく見てみましょう。
PHOTO_OUT_NAMEは、作成するIFSファイルの名前です。ここでは、IFSの出力場所と写真名の組み合わせにしました。
PHOTO_OUT_NLは、PHOTO_OUT_NAMEの値の長さです。
PHOTO_OUT_DLは、出力フィールドで、 データの長さを表します。このプログラムでは、このフィールドについて何も行いません。
PHOTO_OUT_FOは、ファイル オープンの種類です。このフィールドは SQFOVRにセットしました。これは、ファイルの新規作成または既存のファイルの置換を意味します。
データ構造に適切な値を登録したら、IFS内に画像を作成するSQL selectステートメントを発行します。
このプログラムを実行した後、IFSフォルダー「/mikel/photos」にロードされた画像を見ることができます。
これで完了でしょうか。そういうわけではありません。実際の画像を見ることができるか確認するために、1枚の写真をダウンロードして開いてみましょう。IBM i Access Client Solutionsを使ってファイルをダウンロードしてから、Windows Photosで開いて表示してみます。「lexie1.png」の画像を見てみると、このシリーズの「パート1」でSQL表へロードした同じ画像であることがわかります。
一度やり方を理解したら、画像や他のメディア タイプについての作業はかなり簡単です。このコードを他の目的に使う活用法を思い付くのではないかと思います。これで、IBM iでの画像の格納および取得に関するシリーズは完了です。このシリーズがお役に立つことを祈っています。