[自習環境の登録申込の受付最終日:2026年2月26日(木曜日)]
詳細はこちら
前回の復習
「第三回プログラムの基本構造」では、FFRPG のソース・コードとプログラムの関係、基本的なステートメントと変数のスコープおよび記憶域について解説をしました。これらは FFRPG のプログラムを理解する上で避けて通れない知識です。この内容をベースに連載記事は進んでいきますので、何度も復習をして理解してください。 それでは、今回から複数回に渡ってデータベース・プログラミングを解説していきます。IBM i は OS に組み込まれたリレーショナル・データベース DB2 for i が標準のデータベースです。この RDB に記録された膨大な情報や、発生するトランザクション情報をいかに参照および記録していくのか。この SoR の領域をカバーしてきた言語が RPG です。まずは今回の記事で FFRPG で DB2 for i の情報を扱う基本的な仕組みをマスターしていきましょう。データベース・プログラミング
RPG プログラムから DB2 for i へアクセスする方法は2通りあります。ひとつはネイティブ・アクセスであり、もうひとつは SQL アクセスです。 ネイティブ・アクセスは RPG プログラムが DB2 for i にアクセスする一般的な手法です。しかし、IBM i 独自の作成方法や名称があり、これから DB2 for i を勉強する方には初めてのことばかりで少し理解しにくいところがあるかもしれません。 DB2 for i は、他のリレーショナル・データベース製品で使われている SQL を使ったアクセスもサポートされているので、まずはこちらを使った FFRPG をサンプルにデータベース・プログラミングに慣れていきましょう。ネイティブ・アクセスについては第六回の記事で解説する予定です。SQL
IBM i でサポートされている SQL は、他のプラットフォームでも利用されている SQL 標準に準拠していますので、IBM i 以外の技術者の方にもすぐに理解していただけると思います。SQL は FFRPG 内で記述することが可能で、SQL を通して FFRPG から DB2 for i のデータを処理することができます。SQL を記述した FFRPG プログラムは、以下のステップを経てプログラム・オブジェクトになります。- プリコンパイル
- 静的 SQL ステートメントの準備
- 変更されたソース・プログラムのコンパイル
- プログラム(*PGM)
- サービス・プログラム(*SRVPGM)
- モジュール(*MODULE)
使用するテーブル
それでは、今回のプログラムで参照するテーブルを見ていきましょう。テーブル名は得意先マスターです。以下のようなデータを含んでいます。
このテーブルは以下の4つのカラムで構成されます。すべて文字タイプでカッコ内が桁数を表します。
- CSCSCD(5)- 得意先コード
- CSCSKN(20)- 得意先名称(カナ)
- CSCSKJ(20)- 得意先名称(漢字)
- CSADR1(20)- 得意住所1
icafe004 プログラム(単一フィールド値の取得)
では実際のプログラム icafe004 の作成を通して、SQL を実行するためのステートメントを見ていきましょう。 EXEC SQL FFRPG プログラム内で SQL ステートメントを記述するには、EXEC SQL ステートメントを使用します。他のステートメント同様セミコロンで終わる点に注意してください。SQL 文は複数行にまたがって記述することができます。今回使用する SQL文は以下の通りです。
この SQL により、以下の検索が実行されます。
- 検索対象テーブルは TECSMP(FROM)
- 検索条件は、CSCSCD(得意先コード)が ‘01010’ のもの(WHERE)
- 検索できたら、その得意先の名称を変数 customerName にセット(CSCSKJ INTO :customerName)
まず前回のプログラムと異なるところを説明します。
記述を削除したもの
- ctl-opt dftname(iWorldxxxxx);
追加のパラメーターの設定値は以下の通りです(F11 キーでキーワードが表示されます)。
- COMPILEOPT(’TGTCCAID(5035)’)
- RPGPPOPT(*LVL2)
icafe005 プログラム(複数フィールド値の取得)
icafe004 では、ホスト変数にセットするフィールドは一つだけでした。では、複数のフィールドの値を取得するにはどのように記述すればよいのでしょうか?この場合の SQL は以下のように記述します。
複数のフィールドの値を取得するには、SELECT の直後に取得したいフィールドをカンマで区切って記述します。そして、INTO の直後に取得したい複数フィールドの値をセットするホスト変数を同様にカンマで区切って記述します。ホスト変数の数とタイプはそれぞれ合っていなければならないので注意してください。
では、このプログラム icafe005 を作成してみましょう。
今回は dsply を二回実行していますので、「荒川薬局」と住所「東京都荒川区」が画面に表示されれば正解です。
icafe006 プログラム(データ構造を使用した複数フィールド値の取得)
取得するフィールド数が 4 つとか 5 つぐらいであれば、上記のような記述でも問題ないかもしれませんが、数十のフィールドを持つテーブルからデータを取得する場合はどうすればよいのでしょうか?例えば 100 ある場合は、それぞれ SELECT 直後に 100 フィールド、INTO 直後に 100 ホスト変数を記述することはできます。しかしこのような記述をするとソース・コードの見通しが悪くなってしまいます。そこで利用できるのがデータ構造です。 データ構造(データ・ストラクチャー)は、複数フィールドに対して名前を指定し、その名前で処理できるようにしたものです。具体的な例を見てみましょう。
データ構造は dcl-ds と end-ds で複数の変数を囲うようにして記述します。上記の例では、データ構造 customer は、内部に4つのサブ・フィールドを持ちます。サブ・フィールドはそれぞれ名前とデータ・タイプを指定します。この並び順は、今回の実習で使用している TECSMP テーブルの構造と同じである点に注意してください。
dcl-ds にqualified キーワードが指定されていますが、これを指定することにより、サブ・フィールドの参照は データ構造名での修飾が必須になります。
- customer.CSCSCD など
SELECT 直後の * は、全てのフィールドを選択することを表しています。そして、その選択されたフィールドの値をセットするホスト構造として :cusotmer を指定しています。このように記述することで、テーブルのフィールド名がいつくあろうと対応するデータ構造を記述するだけで済みます。
ホスト構造を使用したプログラム・コードは以下の通りです。icafe006 プログラムとして作成してみましょう。
プログラム最後の dsply ですべてのフィールドの値を表示しています。実行結果はいかがでしたか?
icafe007 プログラム(EXNAME データ構造を使用した複数フィールド値の取得)
一般的に、テーブルはそれ自体にカラム情報を持っています。このカラム情報をコンパイラーが参照することができれば、データ構造の定義はより簡単になります。
上記サンプルでは、サブ・フィールドが定義されていません。そのかわり、extname キーワードが指定されています。このキーワードにはデータ構造のサブ・フィールド記述として使用されるフィールド記述が入っているテーブルの名前を指定します。
この定義によりTECSMP テーブルに定義されているカラム情報(名前、データ・タイプ、桁数など)からサブ・フィールドが自動的に定義されます。
フィールド数が多いテーブルでも、この記述方法だと簡単ですね。
実際のプログラム・コードは以下の通りです。icafe007 プログラムとして作成してみましょう。
演習問題
それでは演習問題です。得意先名を取得するサブ・プロシージャー getCustomerName を記述し、main プロシージャーから以下のように呼び出すプログラム icafe008 を作成してみましょう。
プログラムの構造、引数の受け渡しおよび値の戻しなどは icafe003.rpgle を参考にしてください。
【ヒント】getCustomerName プロシージャーで受け取った得意先コードは、select 文で使えるように記述しなければなりません。icafe007 までは、得意先コードは where 内で 文字リテラルで指定していますが、実はここもホスト変数を記述できます。
回答例は次回掲載します。頑張って icafe008 を完成させましょう。
終わりに
DB2 for i のテーブルのデータを SQL で参照するプログラムを解説しましたがいかがでしたか?各フィールドの参照方法や、extname キーワードを使用した便利なデータ構造定義方法など、実際の開発現場でもよく使用するものなので、しっかり理解してください。 今回は select 文で参照するレコードは常に1レコードでしたが、条件の指定方法によっては複数レコードが該当する場合ももちろんあるでしょう。次回はそのようなケースでのデータの参照方法や、更新および削除について解説する予定です。 どうぞお楽しみに!著者プロフィール










