はじめに
Access Client Solutions(ACS) 1.1.9.8のアップデートでDb2に挿入した画像を表示できるというものがありました。

そもそもDb2に画像入れる具体的な手順がわからなかったので、試してみました。
実は25年前から対応済🤯
ACSでDb2に埋め込まれた画像が表示できるようになったのはつい最近ですが、Db2 for i に画像をバイナリ(BLOB)形式で格納できるようになったのは、1999年のV4R4からできたとのこと。IFSに配置できるだけじゃないんですね!
参考したRedBook:DB2 UDB for AS/400 Object Relational Support
検証環境情報
- IBM i 7.6
- ACS 1.1.9.8
ざっくり手順
- IFSに画像を配置
- 画像を入れたいテーブルにBOLB列を追加する
- IFS_READ_BINARY関数を利用して、INSERTをTKPNGに実施する
- ACSで画像を表示
手順
IFSに画像を配置
FTPやACSを使用して、画像ファイルを適切なディレクトリ(例:/home/user/images/)にアップロードします。
今回はACSのIFS機能を使用して/home/sakura/image/にusaicon.pngを配置しました。


画像を入れたいテーブルにBOLB列を追加する
次に、画像を格納するテーブルに BLOB 型の列を追加します。
以下の SQL コマンドでテーブルを作成します。
SQLはACSの「Run SQL Scripts」を使用しました。SQLが実行できればVS codeでも5250画面からでもOKです。
今回はライブラリーSAKURALIBにテーブルSAKUTABを作成しました。
IDは主キーで、自動的に番号が振られるようにしています。
filename と TKPNG という 2 つの列も持たせています。TKPNG 列は画像を格納する BLOB 型として定義しました。
CREATE TABLE SAKURALIB.SAKUTAB (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
filename VARCHAR(255),
TKPNG BLOB(10M)
);
IFS_READ_BINARY関数を利用して、INSERTを実施する
Db2に画像を入れるにはバイナリー型に変換する必要があります。
IFS上にある画像をバイナリー型に変換してくれるのが、IFS_READ_BINARY関数です。
IBM i 7.3の Technology Refresh 9(2020年11月)で登場したもので、以前はRPGプログラム等でバイナリ変換する必要があったものがこのSQL関数を使うことで簡単にバイナリ変換できるようになりました。
これを活用して、バイナリ型に変換してもらった情報をテーブルSAKUTABにINSERTします。
INSERT INTO SAKURALIB.SAKUTAB (filename, TKPNG)
SELECT 'USAGI',
CAST(LINE AS BLOB(10M))
FROM TABLE(QSYS2.IFS_READ_BINARY(PATH_NAME => '/home/sakura/image/usaicon.png')) AS t;
指定された IFS パス /home/sakura/image/usaicon.png に格納された画像ファイルを読み込み、そのバイナリデータを TKPNG 列に、画像ファイル名を filename 列に挿入するものです。
filename 列には USAGIというファイル名が、
TKPNG 列には、指定された画像ファイルのバイナリデータが挿入されます。
実行結果を確認します。
SELECT * FROM SAKURALIB.SAKUTAB as a;
ACSで画像を表示
バイナリの部分を右クリックし、view column dataをクリックします。

補足:可変長文字列と固定長文字列
今回、画像ファイル名を保存するために以下のように filename 列を定義しています。
filename VARCHAR(255)
これは 「可変長文字列型(VARCHAR)」 です。
IBM i の Db2では、以下のように用途に応じて文字型を使い分けることができます。
VARCHAR(n)(可変長文字列)
格納される文字列の長さに応じて必要な分だけの領域を使います。
たとえば 'usagi.png'(9文字)を格納した場合、9文字分だけ領域を使用します。
文字列の長さが不定な場合(ファイル名やコメントなど)におすすめです。
CHAR(n)(固定長文字列)
常に n 文字分の領域を使用します。
短い文字列の場合は、空白(スペース)で自動的に埋められます。
たとえば 'IBM' を CHAR(10) に格納すると "IBM "(7つの空白)が保存されます。
社員IDや区分コードのように、文字数が固定されるデータに適しています。
今回の例では、ファイル名(例: 'usaicon.png')の長さがまちまちなので、VARCHAR を使うことでストレージの効率性と柔軟性を両立できます。
VARCHARは、長さが不定の文字列(例:ファイル名、自由入力欄)、CHARは長さが固定されたコード値に向いている(例:ID、区分コード)との認識です。

