Oracle PL/SQL FOR LOOPと例

⚡ スマートサマリー

Oracle PL/SQLのFORループは、指定された下限値と上限値の間で、コードブロックを既知の回数だけ実行します。ループ変数は暗黙的に宣言され、自動的にインクリメントされるため、手動でカウンターを用意する必要はありません。また、REVERSEキーワードを使用すると、ループのカウントダウンを下げて実行できます。

  • 🔢 最適な用途: FORループは、繰り返し回数が既知の場合に適しているが、条件が不明確な場合には適していない。
  • 測定レンジ: 下限値と上限値は、ループが実行される回数を定義します。
  • ⚙️ 暗黙のカウンター: ループ変数は自動的に宣言され、自動的にインクリメントされます。
  • 🎯 範囲: ループ変数はループ内でのみ存在します。
  • 🔄 逆行する: 下限値の前にREVERSEを追加すると、ループがカウントダウンするようになります。
  • 🪜 入れ子構造: ループは入れ子にすることができ、内側のループは外側のループの各反復処理で完全に実行されます。
  • 🚪 自動終了: 変数が範囲外になると、ループは自動的に終了します。

Oracle PL/SQLのForループ

FORループとは何ですか?

「FOR LOOP」文は、何らかの条件に基づいてではなく、既知の回数だけコードを実行したい場合に最適です。

このループでは、下限値と上限値が指定されており、ループ変数がこの範囲内にある限り、ループが実行されます。

ループ変数は自己インクリメント型なので、明示的なインクリメント操作は不要です。ループ変数は暗黙的に宣言されるため、宣言する必要はありません。

FOR <loop_variable> in <lower_limit> .. <higher_limit>
LOOP
<execution block starts>
.
.
.
<execution_block_ends>
END LOOP;

構文の説明:

  • キーワード「FOR」はループの開始を示し、「END LOOP」はループの終了を示します。
  • ループ変数は、実行部分を実行する前に毎回評価されます。
  • 実行ブロックには、実行する必要のあるすべてのコードが含まれており、任意の実行可能なステートメントを含めることができます。
  • loop_variableはループの実行中に暗黙的に宣言され、そのスコープはループ内部のみに限定されます。
  • ループ変数が範囲外になると、制御はループから抜ける。
  • lower_limit の前にキーワード 'REVERSE' を追加することで、ループを逆順に動作させることができます。

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

FORループで1から5までの数字を出力する

BEGIN
dbms_output.put_line('Program started.');
FOR a IN 1 .. 5
LOOP
dbms_output.put_line(a);
END LOOP;
dbms_output.put_line('Program completed.');
END;
/

Code 説明:

  • Code 2行目: 「プログラムが開始されました」というメッセージを表示します。
  • Code 3行目: キーワード「FOR」はループの開始を示し、ループ変数「a」が宣言されます。この変数は1から5までの値を取ります。
  • Code 5行目: 「a」の値を出力します。
  • Code 6行目: キーワード「END LOOP」は、実行ブロックの終了を示します。
  • 5行目は「a」の値が6に達するまで実行され続け、その時点で条件が満たされなくなり、制御がループから抜ける。
  • Code 7行目: 「プログラムが完了しました」というメッセージを表示します。

ネストされたループ

ループ文はネストすることもできます。外側のループと内側のループは異なる型にすることができます。ネストされたループでは、外側のループが実行されるたびに、内側のループが完全に実行されます。

入れ子構造

LOOP --outer
<execution block starts>
LOOP --inner
<execution_part>
END LOOP;
<execution_block_ends>
END LOOP;

構文の説明:

  • 外側のループの内側に、さらにループが1つある。
  • ループの種類は問わず、実行機能は同じです。

例1: この例では、FORループ文を使用して1から3までの数字を出力します。各数字は、その値と同じ回数だけ出力されます。

ネストされたFORループの例 パート1

ネストされたFORループの例 パート2

DECLARE
b NUMBER;
BEGIN
dbms_output.put_line('Program started');
FOR a IN 1..3
LOOP
b:= 1;
WHILE (a>=b)
LOOP
dbms_output.put_line(a);
b:= b+1;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed');
END;
/

Code 説明:

  • Code 2行目: 変数「b」を「NUMBER」データ型として宣言します。
  • Code 4行目: 「プログラムが開始されました」というメッセージを表示します。
  • Code 5行目: キーワード「FOR」はループの開始を示し、ループ変数「a」が宣言されます。この変数は1から3までの値を取ります。
  • Code 7行目: 毎回「b」の値を「1」にリセットします。
  • Code 8行目: 内部 whileループ 条件 a>=b をチェックします。
  • Code 10行目: 上記の条件が満たされる限り、「a」の値を出力します。
  • Code 14行目: 「プログラムが完了しました」というメッセージを表示します。

FORループと逆方向のFORループ

デフォルトでは、FOR ループは下限から上限までカウントアップします。REVERSE キーワードを追加すると、下限から上限までカウントダウンしながら、上限から下限までカウントアップします。ping 制限事項は同じ順序で記載されています。違いが分かりやすいように、両方の形式を以下に並べて表示しています。

フォーム ヘッダ 値の順序
上昇 IN 1 .. 5 の場合 1、2、3、4、5
下行 逆方向の場合 1 .. 5 5、4、3、2、1

REVERSE を使用した場合でも、下限は上限より先に書き込まれることに注意してください。繰り返し方向が変わるだけです。ループのカウントが事前にわからない場合は、 基本ループ より良い選択です。

よくあるご質問

いいえ。FORループは変数を暗黙的に宣言し、その変数はループ内でのみ存在します。ループ外で同じ名前の変数を宣言しても、ループで使用される変数には影響しません。

REVERSE は、ループを上限値から下限値まで順に実行します。制限値は引き続き低い値から高い値へと書き込まれますが、値が処理される順序だけが逆になります。

反復回数が固定範囲など、事前にわかっている場合はFORループを使用します。条件が満たされている間ループを継続する必要があり、反復回数が固定されていない場合は、WHILEループを使用します。

はい、基本的なループが2つの固定値の間を単純にカウントする場合です。AIは手動でカウンターとEXITをFOR範囲に置き換えることで、コードを短くすることができます。境界が元の値と一致していることを確認してください。

いいえ。ループ変数はループ内では読み取り専用なので、代入するとコンパイルエラーになります。処理の流れを変更するには、別の変数を使用するか、EXIT でループを終了してください。