メニューボタン
IBMi海外記事2017.01.12

SQL PL-- FOR ループ

Ted Holt 著

SQL PL には 4 つのループ構造があります。私の考えでは、最も便利なのはFOR 構造です。RPG FOR 命令コードとは異なり、それよりはるかにパワフルで、学びやすく使いやすいのです。その動作を見てみましょう。
FOR は読み取り専用結果セットを繰り返し、処理する行がなくなると終了します。FOR ループを、OPEN、FETCH、CLOSE の乱雑さのない、読み取り専用カーソルと考えてみてください。ストアード・プロシージャーを図にしてみます。

技術情報code01

ストアード・プロシージャー BILLING は、 SQL インターフェースを通して実行されるプログラム・オブジェクトです。例えば、Run SQL Scripts、またはグリーンスクリーンの Start SQL Interactive Session (STRSQL) コマンドなどの、 GUI インターフェースを使用して呼び出すことができます。

技術情報code02

CL コマンド・ラインから実行する場合、RUNSQL を使用します。

技術情報code03

このストアード・プロシージャーは、パラメーターの 1 つである、3 桁のパック 10 進数の請求サイクルを受け入れます。Yipなど(以下の参考文献を参照)が提案した規約に従い、パラメータ名の前にpを付けることにより、クエリ内のテーブルとビューの列と区別します。

FOR の後にループ名が続きます。この場合は One_Customer になります。結果セットの列はこの名前で修飾されます。FOR ループは、対象の請求サイクルについて、すべての顧客を取得する SELECT ステートメントを実行します。

ループの本文は DO という言葉で始まり、END FOR で終わります。本文に 1 つ以上のステートメントを配置することができます。この例では、顧客の送り状を作成する RPG プログラム BILL200R を呼び出します。顧客の口座番号を結果セットから BILL200R に渡している点に注目してください。パラメーターは、表名ではなくループ名で修飾されている点に注目してください。

同じアプリケーションの異なるバージョンを以下に示します。RPG プログラムを呼び出してもかまいませんが、アプリケーションはデータを作業テーブルに読み込む必要があり、別のプログラムが作業テーブルを読み込み、送り状を作成するとします。

技術情報code04

ストアード・プロシージャーの本文は、常に 1 つのステートメントで構成されています。最初の例には FOR ステートメントが 1 つ入っています。2 番目の例にはコンパウンド・ステートメントが 1 つ入っています。 DECLARE は v_ID という変数を作成し、初期値はゼロが指定されています。この変数は作業テーブルのキー・フィールドとして使用されます。

作業テーブルについて言えば、請求プロセスで再読み込みされる前にクリアする必要があります。CL では、Clear Physical File (CLRPFM) コマンドを使用します。この例では、WHERE 節のない DELETE を使用します。この例を DB2 の以降のリリースで構築していたら、TRUNCATE TABLE を使用したでしょう。

FOR ループは、以前の例とはわずかに異なります。SELECT では、 CUSTOMERS 表からより多くの列が必要になります。本文で CALL を SET および 2 つの INSERT と置き換えました。SET はキー・フィールドを増やします。最初の INSERT ステートメントは、選択された請求サイクルに割り当てられた顧客のオープンな売上すべてを、トランザクションの表に読み込みます。2 番目の INSERT ステートメントは、ヘッダー情報を読み込みます。より多くの表 (割引率の表など) からデータを読み込むことで、この例をもっと現実に近いものにできたとは思いますが、コードはできる限りシンプルにしたかったのです。

繰り返しますが、INSERT ステートメントは、ループ名 One_Customer を使用して結果セットから列を修飾します。CUSTOMERS 表の相関名 c は、 SELECT ステートメントでのみ使用されます。

FOR ループの後、請求 ID ごとに、ヘッダー・テーブルの合計発注列をトランザクションの合計で更新します。請求プログラムが顧客に送り状を送付するため、作業テーブルの準備ができました。

FOR ループで取り出された行を更新または削除する必要がある場合は、カーソルから結果セットにアクセスする必要があるでしょう。そのトピックについては、別の機会までお待ちください。

あわせて読みたい記事

PAGE TOP