Oracle PL/SQL ループと例

ループとは何ですか?

ループを使用すると、プログラム内のコードの特定の部分を必要な回数だけ実行できます。

このチュートリアルでは、PL/SQL のループの概念とループの制御フローについて説明します。

ループの概念の紹介

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

  • コードの再利用性
  • コードサイズの縮小
  • 簡単な制御の流れ
  • 複雑さの軽減

以下の図は、ループの概念を図で示しています。

Oracle 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種類のループを提供します

基本的なループ文

このループ文は、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」が見つかった場合に終了します
使用法 特定の条件に基づいて終了しない場合に使用すると便利です。