SQLテーブルへの画像の保存、パート1
このシリーズの前半では、IBM i上のSQLテーブルに画像(または他のメディア)を格納する方法についてみていきます。 この目的を達成するために、私たちは、IFS内のフォルダから画像の名前と場所を持つテーブルを読み込んで、その画像をテーブルに書き込むRPGプログラムを作成します。
画像は、BLOBデータ型として定義されている列に格納されます。 'BLOB'は 'Binary Large Object'の略で、データベース内の単一エンティティとして格納されるバイナリデータの集合です。画像をテーブルに格納する方法とに対して 画像の位置だけをテーブルに格納する方法とは常に激しく議論されています。 この記事の目的は、その議論に重点を置くことではなく、そうすると決めた場合にテーブルにイメージを保存する方法を示すことです。
始める前に、画像の入っているIFS内のフォルダを見てみましょう。 私の犬の5枚の写真が入っています。
有効な画像で作業していることがわかりましたら、それらの画像のうちの一つを見てみましょう。 IBM i Access Client Solutionsを使用してIFSから 'lexie1.png'をダウンロードし、Windows Photosで表示します。
有効な画像があることがわかったので、これらの画像をテーブルにロードするプログラムに入ることができます。
----------------------------------------
このストーリーにはコードが含まれており、ここからダウンロードできます。
----------------------------------------
興味のある画像を特定するために、IFSから処理しようとしている画像に関する情報を含むPhoto_Locテーブルを使用します。 私たちには特に画像の名前と場所が重要です。 この例では、画像に関する情報を含むテーブルに必要な値があらかじめロードされています。
'Photo_Loc'テーブルは、下記のように 'create table'コマンドで作成されました。
私たちのゴールは簡単で、3つのステップがあります:
- 画像の場所を保持するテーブルを読みます。
- IFSからイメージを取得します。
- BLOBデータ型で定義された列を持つSQL表であるPHOTOSに画像を挿入します。
コードを一歩進んでみましょう。最初のステップであるプロセス、サブルーチンProcessPhotosは、イメージロケーションテーブルを読み込み、各行(レコード)に対してサブルーチンWriteToSqlTableを実行して画像をテーブルに格納します。
ProcessPhotosサブルーチンでは、カーソルを使用してphoto locationテーブルから行を取得します。 selectステートメントには、プロセスに必要な2つの列(フィールド)、写真名、写真の場所がデータ構造に取り込まれます。
フェッチする行ごとに、サブルーチンWriteToSqlTableを呼び出してイメージをPHOTOSテーブルに挿入します。 最後の行をフェッチしたら、カーソルを閉じます。 この例をシンプルにするために、私はエラー処理をコード化していませんが、どこに配置したほうがいいかは書き留めておきます。
作業の大半は 'WriteToSqlTable'サブルーチンで行われます。
ここにはコードはあまりありませんが、多くのことが起こっています。 SQL挿入ステートメントに入る前に、Photo_in_FO、Photo_in_NAME、Photo_in_NLのフィールドがどこにあるのかを特定し理解することが重要です。 このプログラムでは、SQL_type(BLOB_file)データ型で定義されたPhoto_inという変数を定義しました。
SQLプリコンパイラは、 'Photo_in'変数を次の形式のデータ構造に変換します。
これらそれぞれの意味を解説しましょう。
- PHOTO_IN_NAMEは読んでいるIFSファイルの名前です。
- PHOTO_IN_NLはPHOTO_IN_NAME(読んでいるストリームファイル)の値の長さです。
- PHOTO_IN_DLは出力フィールドで、 'データ長'の略です。私たちのプログラムではこのフィールドには何もしません。
- PHOTO_IN_FOは開いているファイルのタイプです。私たちはこのフィールドを 'SQFRD'に設定しています。これは、'ファイルの読み取り'を行うことを意味します。
これでデータ構造が作成されたので、写真の名前、写真、レコードを書き込んだプログラムの名前をPhotosテーブルに入力するSQL挿入を実行します。レコードを追加または更新した日時や、追加または更新を実行したユーザーとプログラムを追跡するために、すべてのテーブルに監査フィールドを保存するのが私は好きです。この情報を持っていることは、監査目的やプロセスで発生した可能性のある問題のトラブルシューティングにとても役に立ちます。
プログラムを実行すると、他のプログラムやプロセスで使用できる写真でいっぱいになったテーブルが作成されます。結果の表を以下に示します
私たちはテーブルに5つの画像を作成しました。 1つは.png形式で、他は.jpg形式です。 イメージを含むBLOBフィールドはPHOTOと呼ばれます。 BLOBデータ型の部分を理解すれば、それにイメージを書き込むことは簡単です。 このシリーズの第2部では、SQLテーブルからイメージを抽出してIFSに書き戻します。 乞うご期待。