Oracle PL/SQL IF THEN ELSE 文: ELSIF、NESTED-IF
⚡ スマートサマリー
PL/SQLの意思決定ステートメントは、ブール条件に基づいてどのコードを実行するかを制御します。 Oracle IF-THEN、IF-THEN-ELSE、IF-THEN-ELSIF、およびNESTED-IFを提供するため、プログラムはブロックをスキップしたり、2つのパスから選択したり、複数の選択肢から1つを選択したりできます。
意思決定ステートメントとは何ですか?
意思決定ステートメントはフロー制御を決定します SQL 条件に基づいたステートメント。これにより、プログラマは特定のブロックの実行を阻止したり、条件に基づいて目的のブロックを選択したりする際に、より詳細な制御が可能になります。以下に、意思決定ステートメントを図で示します。

意思決定に関する記述の種類: Oracle 以下の種類を提供します。
- IF-THEN
- イフ・ザ・エルス
- イフ・ザ・エルシフ
- 入れ子のIF
- HOUSES
- 検索されたケース
このチュートリアルでは、IF のバリアントについて説明します。CASE と検索 CASE 形式については、 PL/SQL CASE文 ガイド。
IF-THEN ステートメント
IF-THEN ステートメントは、条件が満たされた場合にのみコードの特定の部分を実行するために使用されます。条件は、 ブーリアン (真/偽)値。これは基本的な条件文であり、 Oracle 事前に定義された条件に基づいて、コードの一部を実行するかスキップするかを決定します。
IF-THEN文の構文:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END IF;
- 上記の構文では、キーワード「IF」の後に「TRUE」または「FALSE」と評価される条件が続きます。
- コントロールは条件が返される場合のみ。
- 条件が評価された場合SQL はスキップしますそして、「END IF」ブロックの後のコードの実行を開始します。
注意: 条件が「NULL」と評価された場合、SQLは「NULL」を「FALSE」として扱います。
例1: この例では、数値が100より大きい場合にメッセージを表示します。
DECLARE a NUMBER := 10; BEGIN dbms_output.put_line('Program started.'); IF( a > 100 ) THEN dbms_output.put_line('a is greater than 100'); END IF; dbms_output.put_line('Program completed.'); END; /
Code 説明:
- Code 2行目: 変数「a」を「NUMBER」データ型として宣言し、値「10」で初期化します。
- Code 4行目:「プログラムが開始されました」という文を出力します。
- Code 5行目:変数「a」が「100」より大きいかどうかという条件をチェックします。
- Code 6行目:'a'が'100'より大きい場合、「aは100より大きい」と表示されます。'a'が100以下の場合、条件を満たさないため、表示文は無視されます。
- Code 8行目:「プログラムが完了しました」という文を出力します。
Code 出力:
Program started. Program completed.
例2: この例では、指定された文字が英語の母音(A、E、I、O、U)である場合にメッセージを出力します。
DECLARE a CHAR(1) := 'u'; BEGIN IF UPPER(a) in ('A','E','I','O','U' ) THEN dbms_output.put_line('The character is in English Vowels'); END IF; END; /
Code 説明:
- Code 2行目: 変数「a」をサイズ「1」の「CHAR」型として宣言し、値「u」で初期化します。
- Code 4行目: 変数「a」がリスト(「A」、「E」、「I」、「O」、「U」)に含まれているかどうかを確認します。比較時に大文字小文字を区別しないようにするため、「a」の値は比較前に大文字に変換されます。
- Code 5行目: リストに「a」が含まれている場合、「この文字は英語の母音です」と表示されます。条件を満たさない場合、IF-THENブロックの外に出力文がないため、このプログラムは何も出力しません。
Code 出力:
The character is in English Vowels
IF-THEN-ELSE ステートメント
IF-THEN-ELSE文は、条件に基づいて2つの選択肢から1つを選択するために使用されます。構文は以下のとおりです。
IF-THEN-ELSE ステートメントの構文:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block1> ELSE -execute if the condition failed (returns FALSE) <action_block2> END IF;
- キーワード「IF」の後には、「TRUE」または「FALSE」と評価される条件が続きます。
- コントロールが実行されます条件が返される場合のみ。
- 条件が評価された場合SQLが実行されます。
- いずれにせよ、2つのアクションブロックのうち1つが実行されます。
注意: 条件が「NULL」と評価された場合、SQLは「NULL」を「FALSE」として扱います。
例1: この例では、与えられた数値が奇数か偶数かを出力します。
DECLARE a NUMBER:= 11; BEGIN dbms_output.put_line ('Program started'); IF( mod(a,2)=0) THEN dbms_output.put_line('a is even number'); ELSE dbms_output.put_line('a is odd number'); END IF; dbms_output.put_line ('Program completed.'); END; /
Code 説明:
- Code 2行目: 変数「a」を「NUMBER」データ型として宣言し、値「11」で初期化します。
- Code 4行目:「プログラムが開始されました」という文を出力します。
- Code 5行目: 変数「a」の「2」による剰余が0かどうかを確認します。
- Code 6行目:もし「0」であれば、「aは偶数です」と表示されます。
- Code 7行目: モジュラス値が「0」でない場合、条件はそのため、「aは奇数です」と表示されます。
- Code 10行目:「プログラムが完了しました」という文を出力します。
Code 出力:
Program started. a is odd number Program completed.
IF-THEN-ELSIF ステートメント
- IF-THEN-ELSIF文は、複数の選択肢の中から1つを選択する必要がある場合に使用されます。各選択肢にはそれぞれ独自の条件があります。
- 最初の条件はが実行され、残りの条件はスキップされます。
- IF-THEN-ELSIF文には、いずれの条件も満たされない場合に実行される「ELSE」ブロックを含めることができます。
注意: ELSEブロックは省略可能です。ELSEブロックがなく、かつどの条件も満たされない場合、コントローラはすべてのアクションブロックをスキップし、残りのコードを実行します。
IF-THEN-ELSIF ステートメントの構文:
IF <condition1: returns Boolean> THEN -executed only if the condition returns TRUE <action_block1> ELSIF <condition2: returns Boolean> THEN <action_block2> ELSIF <condition3: returns Boolean> THEN <action_block3> ELSE --optional <action_block_else> END IF;
- コントロールが実行されますcondition1 が返した場合のみ。
- 条件1が満たされない場合、コントローラは条件2をチェックし、以下同様に続きます。
- コントローラは、条件が満たされるとIF文を終了します。そして、一致するアクション ブロックを実行するか、いずれの条件も満たされず、ELSE ブロックが存在する場合は、そのブロックを実行します。
注意: 条件が「NULL」と評価された場合、SQLは「NULL」を「FALSE」として扱います。
例1:ELSEブロックなしの場合。 この例では、else条件なしで、指定された点数に基づいて成績を出力します(点数 >= 70 で A、点数 >= 40 かつ点数 < 70 で B、点数 >= 35 かつ点数 < 40 で C)。
DECLARE mark NUMBER := 55; BEGIN dbms_output.put_line('Program started.'); IF( mark >= 70) THEN dbms_output.put_line('Grade A'); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line('Grade B'); ELSIF(mark >= 35 AND mark < 40) THEN dbms_output.put_line('Grade C'); END IF; dbms_output.put_line('Program completed.'); END; /
Code 説明:
- Code 2行目: 変数「mark」を「NUMBER」データ型として宣言し、値「55」で初期化します。
- Code 4行目:「プログラムが開始されました」という文を出力します。
- Code 5行目: 条件1、つまり「mark」が70以上かどうかを確認します。
- Code 7行目: condition1が失敗したため、condition2 '70 > mark >= 40'がチェックされます。
- Code 8行目: Condition2が返しますそのため、「グレードB」というメッセージが印刷されます。
- Code 12行目:「プログラムが完了しました」という文を出力します。条件3「mark < 35」は、既にTRUE条件が見つかったためスキップされます。
Code 出力:
Program started. Grade B Program completed.
例2:ELSEブロックを使用する場合。 この例では、else条件(点数が70点以上の場合A、点数が40点以上70点未満の場合B、点数が35点以上40点未満の場合C、それ以外の場合「成績なし」)に基づいて、指定された点数に基づいて成績を出力します。
DECLARE mark NUMBER := 25; BEGIN dbms_output.put_line('Program started.'); IF( mark >= 70) THEN dbms_output.put_line('Grade A'); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line('Grade B'); ELSIF(mark >= 35 AND mark < 40) THEN dbms_output.put_line('Grade C'); ELSE dbms_output.put_line('No Grade'); END IF; dbms_output.put_line('Program completed.'); END; /
Code 説明:
- Code 2行目: 変数「mark」を「NUMBER」データ型として宣言し、値「25」で初期化します。
- Code 4行目:「プログラムが開始されました」という文を出力します。
- Code 5行目: 条件1、つまり「mark」が70以上かどうかを確認します。
- Code 7行目: condition1が失敗したため、condition2 '70 > mark >= 40'がチェックされます。
- Code 9行目: condition2が失敗したため、condition3 '40 > mark >= 35'がチェックされます。
- Code 11行目: すべての条件が満たされなかったため、制御はELSEブロックをチェックし、「成績なし」と出力します。
- Code 14行目:「プログラムが完了しました」という文を出力します。
Code 出力:
Program started. No Grade Program completed.
NESTED-IF ステートメント
- NESTED-IF ステートメントを使用すると、プログラマーは 1 つ以上の 'IF' 条件を別の 'IF' 条件の中に配置できます。 。
- 各「IF」条件には、その条件の適用範囲の終わりを示す個別の「END IF」ステートメントが必要です。 。
- 「IF」文は、最も近い「END IF」をその条件の終点とみなします。
- ネストされたIFの図解を以下に示します。
IF <condition1: returns Boolean> THEN --executed only if the condition returns TRUE <action block1 starts> IF <condition2: returns Boolean> THEN <action_block2> END IF; --END IF corresponds to condition2 <action_block1 ends> END IF; --END IF corresponds to condition1
構文の説明:
- 外側のIF文には、アクションブロック内にさらに1つのIF文が含まれています。
- condition1 が返した場合制御が実行されるそして条件2をチェックします。
- condition2 も返す場合、 それからも実行されます。
- condition2 が評価される場合SQLスキップ。
ネストされたIF文の例:3つの数値の中で最大のもの。 この例では、ネストされたif文を使用して、3つの数値のうち最大の値を出力します。数値は宣言部分で割り当てられ(Number = 10、15、20)、ネストされたif文を使用して最大値を取得します。
DECLARE a NUMBER := 10; b NUMBER := 15; c NUMBER := 20; BEGIN dbms_output.put_line('Program started.'); IF( a > b)THEN /*Nested-if 1 */ dbms_output.put_line('Checking Nested-IF 1'); IF( a > c ) THEN dbms_output.put_line('A is greatest'); ELSE dbms_output.put_line('C is greatest'); END IF; ELSE /*Nested-if2 */ dbms_output.put_line('Checking Nested-IF 2'); IF( b > c ) THEN dbms_output.put_line('B is greatest'); ELSE dbms_output.put_line('C is greatest'); END IF; END IF; dbms_output.put_line('Program completed.'); END; /
Code 説明:
- Code 2~4行目:変数「a」、「b」、「c」を「NUMBER」型として宣言し、それぞれ10、15、20で初期化します。
- Code 6行目:「プログラムが開始されました」という文を出力します。
- Code 7行目:条件1、つまり「a」が「b」より大きいかどうかを確認します。
- Code 10行目: 'a'が'b'より大きい場合、ネストされたif 1は'a'が'c'より大きいかどうかをチェックします。
- Code 11~13行目:もし「a」がさらに大きい場合は「Aが最大」と表示され、そうでない場合は「Cが最大」と表示されます。
- Code 18行目: condition1がfalseを返すと、ネストされたif 2は'b'が'c'より大きいかどうかをチェックします。
- Code 19~21行目:'b'が'c'より大きい場合は'B is greatest'と表示され、そうでない場合は'C is greatest'と表示されます。
- Code 24行目:「プログラムが完了しました」という文を出力します。
コードの出力:
Program started. Checking Nested-IF 2 C is greatest Program completed.
意思決定に関する記述の比較
以下の表は、これまで説明してきた様々な条件文をまとめたものです。これを参考に、状況に応じて適切な条件文を選択してください。
| タイプ | 詳細説明 | 使用法 |
|---|---|---|
| IF-THEN | ブール条件をチェックします。TRUEの場合、「THEN」ブロック内のコードが実行されます。 | 条件に基づいて特定のブロックをスキップまたは実行する。 |
| イフ・ザ・エルス | ブール条件をチェックします。TRUEの場合は「THEN」ブロックが実行され、FALSEの場合は「ELSE」ブロックが実行されます。 | 「どちらか一方を選ぶ」状況で最も適切です。 |
| イフ・ザ・エルシフ | 条件を順番にチェックします。最初にTRUEを返すブロックが実行されます。いずれの条件もTRUEでない場合は、「ELSE」ブロックが実行されます。 | 2つ以上の選択肢から選ぶ際に使用する。 |
| 入れ子のIF | 別のIF-THENまたはIF-THEN-ELSIFステートメントの中に、1つ以上のIF-THENまたはIF-THEN-ELSIFステートメントを挿入できます。 | 主にネストされた条件分岐の状況で使用されます。 |



