Oracle PL/SQL ループと例
⚡ スマートサマリー
PL/SQLのループは、コードの一部を指定された回数だけ繰り返し実行します。PL/SQLには、CONTINUE、EXIT、EXIT WHEN、GOTOによって制御される基本ループ、FORループ、WHILEループがあり、ループにはラベルを付けてネストされた構造をきれいに管理できます。

ループとは何ですか?
ループを使うと、プログラム内の特定のコードを必要な回数だけ実行できます。このチュートリアルでは、PL/SQLにおけるループの概念と、ループ内の制御フローについて解説します。
ループの概念の紹介
ループの概念は、コーディングにおいて次のような利点をもたらします。
- コードの再利用性。
- コードサイズを削減しました。
- 操作がスムーズ。
- 複雑さを軽減。
下の図はトイレを示していますping 概念。
上記の図では、ループ条件がチェックされ、条件が満たされている限り、実行ブロックが実行されます。
各反復処理において、ループ条件を決定するループカウンタ変数が変化し、制御がループから抜け出す必要があります。このカウンタは、あらかじめ定義されたカウントに基づいて増減する場合もあれば、条件が満たされるまでブロックの実行を継続する検索条件となる場合もあります。
ループ制御ステートメント
ループの概念を学ぶ前に、ループ制御文を学ぶことが重要です。これらの文は、ループ内の実行の流れを制御します。
CONTINUE
このキーワードは、PL/SQLエンジンに対し、ループ内でCONTINUEが検出された場合、実行ブロック内の残りのコードをスキップして、直ちに次のイテレーションを開始するように指示します。これは主に、ループ内のコードを特定のイテレーション値までスキップする必要がある場合に使用されます。
終了 / 終了するとき
このキーワードは、PL/SQLエンジンに現在のループを直ちに終了するように指示します。ネストされたループでは、内側のループ内のEXITは内側のループのみを終了し、外側のループは終了しません。「EXIT WHEN」の後にブール値を返す式が続きます。結果がTRUEの場合、制御が終了します。
GOTO
この文は、ラベル付き文(「GOTO ;」)に制御を移します。以下の制約があります。
- 制御の移行はサブプログラム内でのみ実行できます。
- 例外処理部分から実行部分への制御の移譲はできません。
他に選択肢がない場合を除き、この記述の使用は推奨されません。なぜなら、コード制御 trac制御権が一方の部門から他方の部門に移管されると、実現可能性は非常に困難になる。
PL/SQLのループの種類
PL / SQLの 以下の3種類のループを提供します。
以下の表は、基本的なループを詳しく説明する前に、これら3つの要素を比較したものです。
| ループ | 終了基準 | 最適な使用例 |
|---|---|---|
| 基本ループ | ブロック内での明示的なEXIT | 出口は固定された数や条件に基づいているわけではありません |
| 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キーワードのない基本的なループ文は、決して停止しない無限ループです。
例1: この例では、基本的なループ文を使用して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; /
Code 説明:
- Code 2行目: 変数「a」を「NUMBER」として宣言し、値「1」で初期化します。
- Code 4行目: 「プログラムが開始されました」というメッセージを表示します。
- Code 5行目: キーワード「LOOP」はループの開始を示します。
- Code 6行目: 「a」の値を出力します。
- Code 7行目: 'a'の値を1増やします。
- Code 8行目: 「a」の値が 5 より大きいかどうかを確認します。
- Code 9行目: キーワード「END LOOP」は、実行ブロックの終了を示します。
- 6行目から8行目は「a」が6に達するまで実行され続け、その時点で条件がTRUEを返し、制御がループを抜ける。
- Code 10行目: 「プログラムが完了しました」というメッセージを表示します。
ループのラベル付け
PL/SQLでは、ループにラベルを付けることができます。ラベルは「<<」と「>>」で囲む必要があります。ループ、特にネストされたループにラベルを付けることで、可読性が向上します。ラベルは、特定のループを終了するためのEXITコマンドで指定できるため、EXITコマンドの後に外側のループのラベルを指定することで、ネストされた構造の外側のループから直接終了できます。
<<OUTER_LOOP>> LOOP <execution_block_starts> . <<INNER_LOOP>> LOOP --inner <execution_part> END LOOP; . <execution_block_ends> END LOOP;
構文の説明:
- 外側のループの内側に、さらにループが1つある。
- '< >' と '< 「>」はこれらのループのラベルです。
例1: この例では、基本的なループ文を使用して1から始まる数値を出力します。各数値は、その値と同じ回数だけ出力されます。数列の上限は宣言部分で固定されています。これを実現するために、ラベルの概念を使用しています。
DECLARE a NUMBER:= 0; b NUMBER; upper_limit NUMBER := 4; BEGIN dbms_output.put_line('Program started.'); <<outer_loop>> LOOP a:= a+1; b:= 1; <<inner_loop>> LOOP EXIT outer_loop WHEN a > upper_limit; dbms_output.put_line(a); b:= b+1; EXIT inner_loop WHEN b>a; END LOOP; END LOOP; dbms_output.put_line('Program completed.'); END; /
Code 説明:
- Code 2行目~3行目: 変数「a」と「b」を「NUMBER」データ型として宣言します。
- Code 4行目: 変数「upper_limit」を「NUMBER」型として宣言し、値として「4」を設定します。
- Code 6行目: 「プログラムが開始されました」というメッセージを表示します。
- Code 7行目: 外側のループには「outer_loop」というラベルが付けられています。
- Code 9行目: 「a」の値は 1 ずつ増加します。
- Code 11行目: 内側のループには「inner_loop」というラベルが付けられています。
- Code 13行目: 'a'が'upper_limit'値より大きいかどうかをチェックする終了条件。小さい場合は処理を続行し、大きい場合は外側のループを直接終了します。
- Code 14行目: 「b」の値を出力します。
- Code 15行目: 'b'の値を1増やします。
- Code 16行目: 'b'が'a'より大きいかどうかをチェックする終了条件。もしそうであれば、内側のループを終了します。
- Code 19行目: 「プログラムが完了しました」というメッセージを表示します。






