MENU

IBM iでSQLを使いこなすための基本情報 ~IBM iとSQL、IBM iサービス、組み込みSQL |特集 SQLの扉を開く ❶

SQLインターフェースを通して、いかに有効にIBM iの情報へアクセスするか、どうすればIBM iの資産を有効に活用できるか。本特集ではこれをテーマに、IBM iに必要なSQL情報をお届けする。第1回はIBM iでSQLを使いこなすための基本情報として、「IBM iとSQL」「IBM iサービス」「組み込みSQL」の3つを紹介する。


IBM iとSQL
7.3と7.4が備えるSQL関連の拡張機能


本題に入る前に、IBM i 7.3および7.4が備えるSQL関連の機能拡張について触れておきたい。

7.3は2016年4月15日、7.4 は2019年4月23日にそれぞれリリースされた。7.3 は6年、7.4は 3年がそれぞれ経過していることになる。各バージョンのリリース後、新機能はテクノロジー・リフレッシュ(TR)として定期的に提供されており、昨年9月に7.3は TR11、7.4はTR5 が利用可能になった。

ではここで、7.3および7.4 で提供されている新機能、およびTRで利用可能になった拡張機能についてSQLを中心に簡単に紹介しよう。

IBM i 7.3
システム期間テンポラル表と監査列

7.3の新機能と言えば、なんといっても「システム期間テンポラル表」と「監査列」だろう。どちらもSQLを使用して実現する機能である。

システム期間テンポラル表 

システム期間テンポラル表は、実際のデータを保管する表と、履歴を管理する履歴表の2つのテーブルから構成される(図表1)。

図表1 システム期間テンポラル表

システムは、システム期間テンポラル表を常に監視し、データ変更などがあれば、それを履歴表に記録する。履歴表の保守は RDBMS が自動的に実行するため、ユーザーが意識する必要はない。

これまでテーブル(物理ファイル)に存在するデータは、現在の状態を表しているに過ぎず、そのデータ(行)が過去どういう値だったか、どういう経緯をたどって現在の値になっているかをデータベースから伺い知ることはできなかった。

しかしシステム期間テンポラル表を使用すれば、「先月のこの商品の価格はいくらだったのか」「昨年のこの顧客の担当者は誰だったのか」といった問いに答えられる。

システム期間テンポラル表を利用するには以下の手順が必要であり、それぞれをSQL文で実行する。

① 3つの必須フィールド(行開始日時、行終了日時、トランザクションID)を追加
② 履歴表を作成
③ ファイルのジャーナル処理を開始
④ バージョン管理を開始

それぞれ以下のSQL文およびコマンドを実行する。

① ALTER TABLE
② CREATE TABLE
③ STRJRNPF(ジャーナルおよびジャーナルレシーバーがなければ作成する)
④ ALTER TABLE

システム期間テンポラル表は、すべてのテーブル(物理ファイル)を対応させる必要はないが、マスターファイルについては、精査したうえで重要と判断されたものはぜひ移行してほしい。

履歴が必要なテーブルは1日も早くシステム期間テンポラル表に移行することが、より多くの履歴を記録することに繋がる。

監査列

監査列とは、システムが値をセットするテーブル内のフィールドのことである。

これまでは最終更新の種類は何か、どのユーザーによって実行されたか、どのジョブによって行われたかなどはすべてプログラム言語内でセットしていた。

監査列は監査目的の情報のため、その値は常に信頼性が担保されねばならないが、プログラムのロジックでセットしている以上、間違った値がセットされる可能性は否定できない。

これをシステムがセットする監査列に置き換えることで、正しい情報が確実にセットされ、監査目的としての値の信頼性も保証される。

監査列もALTER TABLE文を実行することで、既存のテーブルに追加できる。いくつか例を紹介しよう。

図表2はTECSMPテーブルに、9つの監査列を追加している。

図表2 TECSMPテーブルに9つの監査列を追加

このファイルに対して更新操作を実行した時に、各フィールドにセットされる情報のサンプルは図表3のとおりである。

図表3 各フィールドにセットされる情報のサンプル

DATA CHANGE OPERATION は、最終変更が挿入の場合はIが、更新の場合はUがそれぞれセットされる。履歴表の場合、削除された情報としてDがセットされることがある。

図表3の1から6までを「特殊レジスター」、7から9を「グローバル変数」という。それぞれの参考マニュアルは以下のとおりである。

◎特殊レジスター
7.3:https://www.ibm.com/docs/ja/i/7.3?topic=elements-special-registers
7.4:https://www.ibm.com/docs/ja/i/7.4?topic=elements-special-registers

◎グローバル変数
7.3:https://www.ibm.com/docs/ja/i/7.3?topic=reference-built-in-global-variables
7.4:https://www.ibm.com/docs/ja/i/7.4?topic=reference-built-in-global-variables

IBM i 7.4
IWS の受信をトリガーにSQLを実行する

7.4 リリース時点でのSQLに関連する新機能は、HASH組み込み関数やSQEの改善などが中心だが、それ以降のTRで大きな機能拡張を実施している。 

なかでも特筆すべきは、7.3 TR11および7.4 TR5で提供された以下の2つである。

① IWS の受信をトリガーにSQLを実行する機能
② 新しいHTTP関数

①の機能拡張で、RESTとSQLのみで IBM i のデータベースにアクセスすることが可能になった(①と②の詳細は後述)。

IBM iサービス
SQLインターフェースでIBM i情報にアクセス

それでは、SQLで提供される各機能を見ていこう。まずIBM i 7.3 および 7.4 の各TRで、常に追加・機能拡張されているのがIBM iサービスである。このサービスを SQLインターフェースを通して利用することで、IBM i の多彩な情報に簡単にアクセスできる。

IBM i サービスは、アプリケーション、通信、Java、ジャーナル、ライブラリー、メッセージ処理、プロダクト、PTF、セキュリティ、スプール、ストレージ、システム・ヘルス、実行管理と13のカテゴリに分類されており、各サービスは図表4のタイプで提供される。

図表4 サービスのタイプと呼び出し内容

これらの情報へのアクセスは従来、コマンドや追加のプログラミング知識を必要とするシステムAPIが必須であった。しかし上記のタイプで提供されたことにより、簡単にSQLで入手可能になっている。

いくつか例を紹介しよう。

◎ACTIVE_JOB_INFO テーブル関数

WRKACTJOB により表示されるものと同等の情報を入手できる。

現在 QINTER で実行されているジョブの一覧を入手する場合は、以下を実行する。

応用例として、現在QINTERサブシステム内でサインオンしているジョブ数を取得するには、以下を実行すればよい。

◎SCHEDULED_JOB_INFO ビュー 

WRKJOBSCDE コマンドによって表示される情報にアクセスする。

現在登録されているジョブ一覧を追加登録したユーザー名で並べ替えて表示するには、以下を実行する。

◎JOBLOG_INFO テーブル関数 

特定ジョブのジョブ・ログ情報にアクセスする。

◎QCMDEXC プロシージャー

SQLのCALLでIBM iのCLコマンドを実行する。

組み込みSQL
RPG内でSQLコードを記述する


IBM iの基幹システムにおけるデータベース処理は、RPGなどの言語が中心的な役割を担ってきた。RPGはレコード単位の処理が基本で、演算命令もそれを前提に提供されている。そのため、たとえばある特定の条件に合致したレコードを、対象が何件あるかに関わらず、一括更新するなどの演算命令は提供されていない。

一括更新や削除機能は、すべてのレコードを取得して条件に合うかどうかを判断してから処理するか、(可能であれば)論理ファイルに条件を指定し、その論理ファイル経由の全レコードを1レコードずつ処理するなどの方法しかない。

これはパフォーマンスの観点から見ると、あまりよい方法とは言えない(もちろん実際のコードでは、論理ファイルとSETLL/READEの組み合わせで読み取るレコード数を処理レコードと同じにするような工夫はされている)。

図表5は、レコードレベル・アクセスとSQLアクセスの比較である。

図表5 レコードレベル・アクセスとSQLアクセスの比較

条件に合うレコードを処理するには、SQLアクセスのほうが簡単に記述できることがわかる。もちろん、どちらが優れているかを意味するわけではないので、必要に応じてどちらかのアクセスを選択できるのが望ましい。これを実現するために、RPG内でSQLコードを記述することを「組み込みSQL」という。

組み込みSQLを実装するには、「IBM Db2 Query Manager and SQL Development Kit for i」のライセンス・プログラムが必要なので注意してほしい。

RPG内で組み込みSQLを記述する場合、定位置記入形式とフリーフォーム記述形式とで、以下のように書き方が異なる。

◎定位置記入形式の場合


◎フリーフォームの場合


RPG/400(RPG Ⅲ)とILE RPGでは、次のようにプログラム作成コマンドが異なるので注意したい。

RPG/400(RPG Ⅲ):CRTSQLRPG
ILE RPG :CRTSQLRPGI

SQLアクセスにより、レコード単位で処理を実行することも可能である。

RPGに組み込む場合は、以下の手順で記述する。

① 条件を指定したSQL文を準備する
② カーソルを定義する
③ カーソルをオープンする
④ カーソルからレコードを読み取る(フェッチする)
⑤ カーソルからすべてのレコードを処理するまで繰り返す
⑥ カーソルをクローズする

これは、たとえば以下のようにPHPでibm_db2やpdo_ibmなどを使用してDb2 for iにアクセスする方法と似ている。

① データベースへ接続する
② 条件を指定した SQL 文を準備する
③ SQLを接続したデータベースで実行する
④ SQL実行結果の結果セットからレコードを読み取る(フェッチする)
⑤ 結果セットからすべてのレコードを処理するまで繰り返す
⑥ データベースへの接続を閉じる

ibm_db2は関数、pdo_ibmはオブジェクト操作という違いはあるが、データベース処理としては同じ手順を実行する。つまり、RPG内のデータベース処理をすべて組み込みSQLで実装すれば、他言語開発者にとっても理解しやすいプログラムとなる。

もちろんこれは、組み込みSQLがフリーフォームで記述されていることが前提だ。定位置記入形式は、他言語開発者にとって最大のハードルとなるからである。

組み込みSQLでは、データベースを操作するDML(Data Manipulation Language:SELECT、INSERT、UPDATE、DELETE)形式はすべてプログラム内に記述できる。後述する外部サービスへのアクセスなども組み込みSQLで記述可能なので、今後は利用するケースが増えるだろう。

著者
小川 誠氏

1989年、エス・イー・ラボ入社。その後、1993年にティアンドトラストに入社。システム/38 からIBM iまで、さまざまな開発プロジェクトに参加。またAS/400、IBM iの機能拡張に伴い、他プラットフォ ームとの連携機能開発も手掛ける。IBM i関連の多彩な教育コンテンツの作成や研修、セミナーなども担当。2021年6月から現職。

新着