Oracle PL/SQL ループと例

⚡ スマートサマリー

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

  • 🔁 目的: ループはコードブロックを複数回実行することで、コードのサイズと複雑さを軽減します。
  • 🧭 ループカウンター: カウンタ変数はループの条件を決定し、ループを終了するためにはその変数の値が変更されなければなりません。
  • ⏭️ 続く: 現在のイテレーションの残りをスキップして、次のイテレーションを開始します。
  • 🚪 終了 / 終了条件: ループを即座に抜ける。オプションとして、ブール条件が真の場合にも抜ける。
  • 🏷️ ラベル: 二重山括弧で囲まれたループラベルを使用すると、EXIT は外側のループを対象とすることができます。
  • ♾️ 基本ループ: 明示的な終了命令に到達するまで実行されます。終了命令がない場合は、無限ループに陥ります。
  • 🧩 XNUMX つのタイプ: 基本的なループ、FORループ、WHILEループは、よく使われるパターンを網羅しています。

Oracle PL/SQLループ

ループとは何ですか?

ループを使うと、プログラム内の特定のコードを必要な回数だけ実行できます。このチュートリアルでは、PL/SQLにおけるループの概念と、ループ内の制御フローについて解説します。

ループの概念の紹介

ループの概念は、コーディングにおいて次のような利点をもたらします。

  • コードの再利用性。
  • コードサイズを削減しました。
  • 操作がスムーズ。
  • 複雑さを軽減。

下の図はトイレを示していますping 概念。

ローping PL/SQLにおける概念フロー

上記の図では、ループ条件がチェックされ、条件が満たされている限り、実行ブロックが実行されます。

各反復処理において、ループ条件を決定するループカウンタ変数が変化し、制御がループから抜け出す必要があります。このカウンタは、あらかじめ定義されたカウントに基づいて増減する場合もあれば、条件が満たされるまでブロックの実行を継続する検索条件となる場合もあります。

ループ制御ステートメント

ループの概念を学ぶ前に、ループ制御文を学ぶことが重要です。これらの文は、ループ内の実行の流れを制御します。

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キーワードは明示的に指定しなければなりません。

PL/SQLにおける基本的なループ構造

LOOP
<execution block starts>
<EXIT condition based on developer criteria>
<execution_block_ends>
END LOOP;

構文の説明:

  • キーワード「LOOP」はループの開始を示し、「END LOOP」はループの終了を示します。
  • 実行ブロックには、終了条件を含め、実行する必要のあるすべてのコードが含まれています。
  • 実行部には、任意の実行可能なステートメントを含めることができます。

注意: EXITキーワードのない基本的なループ文は、決して停止しない無限ループです。

例1: この例では、基本的なループ文を使用して1から5までの数字を出力します。

基本的なループ印刷で数字の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から始まる数値を出力します。各数値は、その値と同じ回数だけ出力されます。数列の上限は宣言部分で固定されています。これを実現するために、ラベルの概念を使用しています。

ラベル付きループの例 パート1ラベル付きループの例 パート2

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行目: 「プログラムが完了しました」というメッセージを表示します。

よくあるご質問

EXITは無条件にループを抜けます。EXIT WHENは、次のブール式が真の場合にのみループを抜けるため、通常のEXITを囲むIF文が不要になります。

ラベルを使用すると、内側のループの EXIT から名前付きの外側のループを 1 ステップで抜け出すことができます。また、ネストされたコードがはるかに読みやすくなります。 trac単純なEND LOOPステートメント。

ブロックにEXITがない場合、またはカウンタがEXIT条件に達しない場合、ループは停止しません。カウンタが必ずEXIT条件に向かって変化するようにしてください。

多くの場合、そうです。AIは trace カウンタが EXIT 条件に向かって移動しているかどうかを確認し、ループに到達可能な出口がない場合に警告を発します。ただし、データ依存の出口については、確認のためにテスト実行が必要です。

CONTINUE は、現在のイテレーションの残りの部分をスキップして、次のイテレーションに進みます。ループを完全に終了することなく、特定の値を無視したい場合に便利です。