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

SQL PL-- LOOP ループ

Ted Holt 著

このエキサイティングなシリーズの前号では、SQL PL ループ構造のうち、ほぼ間違いなく最も便利な FOR について書きました。私の意見では、便利さの点で次に来るのは LOOP 構造です。残りの SQL PL のように、これは簡単にマスターできる構造で、そのことについて書くことができて嬉しく思います。 その最も単純な書式では、LOOP 構造の構文は次のようになります。
LOOP - 本文 - END LOOP
より現実的な構文は次のようになります。
ラベル: LOOP - 本文 - END LOOP ラベル
本文は単純ステートメントおよびコンパウンド・ステートメント (あるいはその一方) を取り合わせています。 本文の何らかのステートメントで、強制的にループを終了する必要があります。ループを終了するお勧めの方法は LEAVE ステートメントです。RETURN を使用することもできます。これは、プロシージャーまたは関数を終了します。GOTO はお勧めしません。
SQL PL で実行可能ステートメントにラベルを付けることができます。つまり、ステートメントに名前を指定することができます。ラベルは英数字のグループです。CL 同様、ステートメントの識別に使用する場合はラベルの次にコロンが続きます。
好みに応じてラベルを使用して LOOP ループに名前を付けることができます。実際、LEAVE でループを終了する場合、ループにラベルを指定する必要があります。RPG および同等の CL と異なり、LEAVE にはラベルが必要なためです。
シンプルな例を見てみましょう。

技術情報code07 技術情報code08

この例ではカーソルを使用して、唯一のパラメーター p_Company で指定された会社の顧客に請求しています。本日のトピックは LOOP なので、カーソルの操作については説明しません。しかし、別の言語で SQL カーソルを使用したことがあるならば、すぐにこの例を理解できるでしょう。 LOOP 構造の該当部分は赤色になっています。ループは平凡なラベル「Loop1」で始まり、END LOOP で終わります。入れようと思えば、END LOOP の後にループ名を入れることができました。

技術情報code09

大規模なルーチンでは、ループ名を LOOP に追加すればよりわかりやすくなったかもしれません。ルーチンが非常に小さいため、ループ名は不必要ながらくたのように思えました。
RPG のような SQL、CL、COBOL、その他の言語は、読み取りせずにデータ・セットの終了を判断できません。これは中間テストされたループの典型例です。ループの一部 (フェッチ) は少なくとも 1 回実行する必要がありますが、一方フェッチされたデータを処理するコードはまったく実行されない可能性があります。 LOOP構造はこの要件をうまく処理します。
取り出すデータがないと、データベース・マネージャーは値 02000 を SQL 状態変数に読み込みます。これがループを終了する合図になります。LEAVE ステートメントはループ名を参照する点に注目してください。 ループの本文に UPDATE と DELETE の 2 つのステートメントを組み込みました。DELETE は現在の行を参照する点に注目してください。これが FOR ループを使用できなかった理由です。FOR ループは読み取り専用です。
中間テストしたループが大好きなことについて書きました。RPG と CL でそれらを偽造できます。COBOL にはそれらを実装する構造化された方法はありません。(GO TO で実装することはできますが、しません。)SQL PL は直接それらをサポートします。SQL PL には別のループを書き留めます。

あわせて読みたい記事

PAGE TOP