Oracle PL/SQL ループと例
ループとは何ですか?
ループを使用すると、プログラム内のコードの特定の部分を必要な回数だけ実行できます。
このチュートリアルでは、PL/SQL のループの概念とループの制御フローについて説明します。
ループの概念の紹介
ループの概念はコーディングにおいて次のような利点をもたらします。
- コードの再利用性
- コードサイズの縮小
- 簡単な制御の流れ
- 複雑さの軽減
以下の図は、ループの概念を図で示しています。
上図ではループ条件がチェックされ、ループ条件が満たされていれば実行ブロックが実行されます。
各反復では、ループ条件を実際に決定するループ カウンター変数を変更して、制御をループから終了する必要があります。場合によっては、このループ カウンター変数は、定義済みのカウントの増分/減分演算子であり、場合によっては、条件が満たされるまでブロックの実行を継続する検索条件です。
ループ制御ステートメント
ループの概念を学ぶ前に、ループ制御ステートメントを学ぶことが必須です。 ループ制御ステートメントは、ループ内の実行フローを実際に制御するステートメントです。 以下にループ制御文について詳しく説明します。
CONTINUE
このキーワードは、PL/SQL エンジンがループ内でこのキーワードを検出すると、コードの実行ブロック内の残りのコードをスキップし、次の反復がすぐに開始されるようにする指示を PL/SQL エンジンに送信します。 これは主に、ループ内のコードを特定の反復値でスキップしたい場合に使用されます。
終了 / 終了するとき
このキーワードは、PL/SQL エンジンがこのキーワードに遭遇するとすぐに現在のループを終了するという指示を PL/SQL エンジンに送信します。 PL/SQL エンジンがネストされたループ内で EXIT を検出した場合、EXIT は定義されているループから出てきます。つまり、ネストされたループでは、内部ループで EXIT を指定すると、内部ループからコントロールが終了するだけですが、外側のループからではありません。 「EXIT WHEN」の後には、ブール値の結果を与える式が続きます。 結果が TRUE の場合、コントロールは終了します。
GOTO
この文は制御をラベル付き文 (“GOTO ;”) に移します。これには以下の制限があります。
- 制御の移行はサブプログラム内でのみ実行できます。
- 例外処理部から実行部へ制御を移すことはできません
他に代替手段がない場合を除き、このステートメントの使用は推奨されません。ある部分から別の部分に制御が移管されるため、プログラム内でのコード制御のトレーサビリティが非常に困難になるためです。
PL/SQLのループの種類
PL / SQLの 次の3種類のループを提供します
- 基本的なループ文
- forループ文
- Whileループ文
基本的なループ文
このループ文は、PL/SQL の最も単純なループ構造です。 実行ブロックはキーワード「LOOP」で始まり、キーワード「END LOOP」で終わります。
制御がループから抜けるように、この実行ブロック内で終了条件を指定する必要があります。
ループを終了するには、実行部分で EXIT キーワードを明示的に指定する必要があります。
LOOP <execution block starts> <EXIT condition based on developer criteria> <execution_block_ends> END LOOP;
構文の説明:
- 上記の構文では、キーワード「LOOP」はループの始まりを示し、「END LOOP」はループの終わりを示します。
- 実行ブロックには、EXIT 条件を含む、実行する必要があるすべてのコードが含まれています。
- 実行部分には、任意の実行ステートメントを含めることができます。
ご注意: EXIT キーワードのない基本的なループ ステートメントは、決して停止しない INFINITE-LOOP になります。
例: この例では、基本的なループ ステートメントを使用して 1 から 5 までの数字を出力します。そのためには、次のコードを実行します。
DECLARE a NUMBER:=1; BEGIN dbms_output.put_line('Program started.'); LOOP dbms_output.put_line(a); a:=a+1; EXIT WHEN a>5; END LOOP; dbms_output.put_line('Program completed'); END: /
コードの説明:
- コード行 2: 変数 'a' を 'NUMBER' データ型として宣言し、値 '1' で初期化します。
- コード行 4: 「プログラムが開始されました」というメッセージを出力します。
- コード行 5: キーワード「LOOP」はループの始まりを示します。
- コード行 6: 「a」の値を出力します。
- コード行 7: 「a」の値を +1 増やします。
- コード行 8: 「a」の値が 5 より大きいかどうかを確認します。
- コード行 9: キーワード「END LOOP」は、実行ブロックの終わりを示します。
- 6 行目から 8 行目のコードは、条件が TRUE を返し、コントロールがループから終了するため、「a」が値 6 に達するまで実行を続けます。
- コード行 10: 「プログラムが完了しました」というメッセージを印刷する
ループのラベル付け
PL/SQL では、ループにラベルを付けることができます。 ラベルは「<<」と「>>」で囲みます。 特にネストされたループ コードでループにラベルを付けると、読みやすくなります。 ラベルを EXIT コマンドに指定すると、その特定のループを終了できます。 label を使用すると、exit コマンドの後に外側のループの label を指定することで、コントロールがループ内の任意の場所からネストされたループの外側のループを直接終了できるようになります。
<<OUTER_LOOP>> LOOP <execution_block_starts> . <<INNER_LOOP>> LOOP --inner <execution_part> END LOOP; . <executi_block_ends> END LOOP;
構文の説明:
- 上記の構文では、out ループの中にもう XNUMX つのループがあります。
- 「<」 >」と「< >' はこれらのループのラベルです。
例この例では、Basic loop ステートメントを使用して 1 から始まる数字を出力します。各数字は、その値と同じ回数だけ出力されます。シリーズの上限は、プログラム宣言部分で固定されています。ラベルの概念を使用してこれを実現する方法を学びましょう。そのために、次のコードを実行します。
DECLARE a NUMBER:=0; b NUMBER; upper-limit NUMBER :=4; BEGIN dbms_output.put_line(‘Program started.' ); «outerloop» LOOP a:=a+1; b:=l; «inner loop» LOOP EXIT outer_loop WHEN a > upper_limit; dbms_output.put_line(a); b:=b+l; EXIT inner_loop WHEN b>a; END LOOP; END LOOP; dbms_output.put_line('Program completed.'); END; /
コードの説明:
- コード行 2 ~ 3: 変数 'a' および 'b' を 'NUMBER' データ型として宣言しています。
- コード行 4: 変数 'upper_limit' を値 '4' の 'NUMBER' データ型として宣言しています
- コード行 6: 「プログラムが開始されました」というメッセージを出力します。
- コード行 7: 外側のループには「outer_loop」というラベルが付けられています。
- コード行 9: 「a」の値は 1 ずつ増加します。
- コード行 11: 内側のループには「inner_loop」というラベルが付けられています。
- コード行 13: 値「a」が「upper_limit」値より大きいかどうかをチェックする EXIT 条件。 そうでない場合はさらに進み、そうでない場合は外側のループを直接終了します。
- コード行 14: 「b」の値を出力します。
- コード行 15: 「b」の値を +1 増やします。
- コード行 16: 「b」の値が「a」より大きいかどうかをチェックする EXIT 条件。 そうであれば、内側のループからコントロールを抜けます。
- コード行 14: 「プログラムが完了しました」というメッセージを印刷する
まとめ
ループ | 基本ループ |
終了基準 | 実行部分でキーワード「EXIT」が見つかった場合に終了します |
使用法 | 特定の条件に基づいて終了しない場合に使用すると便利です。 |