Oracle PL/SQL IF THEN ELSE 文: ELSIF、NESTED-IF

意思決定ステートメントとは何ですか?

意思決定ステートメントは、フロー制御を決定する者です。 SQL 条件に基づいた発言。 これにより、プログラマーは、特定のコードの実行を防止したり (図 1)、条件に基づいて目的のコードを選択したり (図 2) 、より適切に制御できるようになります。 以下は「意思決定声明」の図解です。

意思決定ステートメントの図
意思決定ステートメントの図

意思決定ステートメントの種類:

Oracle 次の種類の意思決定ステートメントを提供します。

  • IF-THEN
  • イフ・ザ・エルス
  • イフ・ザ・エルシフ
  • 入れ子のIF
  • HOUSES
  • 検索されたケース

IF-THEN ステートメント

IF-THEN ステートメントは主に、条件が満たされた場合にのみコードの特定のセクションを実行するために使用されます。

条件が得られるはずです ブーリアン (True/False) これは、事前に定義された条件に基づいて 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」として扱います。

この例では、数値が100より大きい場合にメッセージを出力します。そのためには、次のコードを実行します。

数値が 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;
/

コードの説明:

  • コード行 2: 変数 'a' を 'NUMBER' データ型として宣言し、値 '10' で初期化します。
  • コード行 4: 「プログラムが開始されました」というステートメントを出力します。
  • コード行 5: 変数 'a' が '100' より大きいかどうかの条件をチェックします。
  • コード行 6: 'a' が '100' より大きい場合、「a は 100 より大きい」と出力されます。 「a」が 100 以下の場合、条件は失敗するため、上記の出力ステートメントは無視されます。
  • コード行 8: 「プログラムが完了しました」というステートメントを出力します。

コード出力:

Program started.
Program completed.

例2: この例では、指定されたアルファベットが英語の母音 (A、E、I、O、U) に存在する場合にメッセージを出力します。

指定された文字が母音の場合にメッセージを出力するには、次のコードを実行します。

DECLARE 
a CHAR(1) :=’u’;
BEGIN
IF UPPER(a) in ('A’,'E','I','0','U' ) THEN 
dbms_output.put_line(‘The character is in English Vowels');
END IF;
END;
/

コードの説明:

  • コード行 2: 変数 'a' をサイズ '1' データ型の 'CHAR' として宣言し、値 'u' で初期化します。
  • コード行 4: 変数 'a' がリスト ('A'、'E'、'I'、'O'、'U') に存在するかどうかの条件を確認します。
  • 大文字と小文字を区別しない比較を行うため、「a」の値は比較前に大文字に変換されています。
  • コード行 5: リストに「a」が存在する場合、「その文字は英語の母音です」というステートメントが出力されます。 条件が失敗した場合、IF-THEN ブロックの外側では印刷ステートメントを発行していないため、このプログラムは何も出力しません。

コード出力:

The character is in English Vowels

IF-THEN-ELSE ステートメント

  • IF-THEN-ELSE ステートメントは主に、条件に基づいて XNUMX つの選択肢から選択するために使用されます。
  • 以下は、IF-THEN-ELSE ステートメントの構文表現です。

IF-THEN-ELSE ステートメントの構文:

IF <condition: returns Boolean>
THEN
	-executed only if the condition returns TRUE
	<action_blockl>
ELSE
	-execute if the condition failed (returns FALSE)
	<action_block2>
END if;
  • 上記の構文では、キーワード「IF」の後に「TRUE」/「FALSE」と評価される条件が続きます。
  • コントロールは、 状態が戻った場合のみ。
  • 条件が次のように評価される場合その後、SQLが実行されます。
  • いずれの場合も、XNUMX つのアクション ブロックのうちの XNUMX つが実行されます。

ご注意: 条件が「NULL」と評価されると、SQL は「NULL」を「FALSE」として扱います。

: この例では、指定された数値が奇数であるか偶数であるかをメッセージを出力します。

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 number1); 
END IF;
dbms_output.put_line (‘Program completed.’);
END;
/

コードの説明:

  • コード行 2: 変数 'a' を 'NUMBER' データ型として宣言し、値 '11' で初期化します。
  • コード行 4: 「プログラムが開始されました」というステートメントを出力します。
  • コード行 5: 変数 'a' の '2' による法が 0 であるかどうかの条件をチェックします。
  • コード行 6: '0' の場合、「a は偶数です」と出力されます。
  • コード行 7: モジュラス値が '0' に等しくない場合、条件は次を返します。 , したがって、「a は奇数です」というメッセージが表示されます。
  • コード行 10: 「プログラムが完了しました」というステートメントを出力します。

コード出力:

Program started.
a is odd number
Program completed.

IF-THEN-ELSIF ステートメント

  • IF-THEN-ELSIF ステートメントは主に、一連の選択肢から XNUMX つの選択肢を選択する必要がある場合に使用され、各選択肢には満たすべき独自の条件があります。
  • 返される最初の条件が実行され、残りの条件はスキップされます。
  • IF-THEN-ELSIF ステートメントには「ELSE」ブロックが含まれる場合があります。 この「ELSE」ブロックは、どの条件も満たされない場合に実行されます。

注意: ELSE ブロックは、この条件文ではオプションです。 ELSE ブロックがなく、どの条件も満たされない場合、コントローラーはすべてのアクション ブロックをスキップし、コードの残りの部分の実行を開始します。

IF-THEN-ELSIF ステートメントの構文:

IF <conditionl: returns Boolean>
THEN
-executed only if the condition returns TRUE <
action_blockl>
ELSIF <condition2 returns Boolean> <
action_block2>
ELSIF <condition3:returns Boolean> <
action_block3>
ELSE —optional 
<action_block_else>
END if;
  • 上記の構文では、コントロールは条件1が返された場合のみ。
  • 条件 1 が満たされない場合、コントローラは条件 2 をチェックします。
  • コントローラーは、次の 2 つの場合に IF ステートメントを終了します。
    • コントローラーが返される条件を見つけたとき。 この場合、対応する action_block が実行され、コントローラーはこの IF ステートメント ブロックを終了し、残りのコードの実行を開始します。
    • どの条件も満たされない場合、then コントローラーは ELSE ブロック (存在する場合) を実行し、IF ステートメントを終了します。

ご注意: 条件が「NULL」と評価されると、SQL は「NULL」を「FALSE」として扱います。

例1: 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;
/

コードの説明:

  • コード行 2: 変数 'mark' を 'NUMBER' データ型として宣言し、値 '55' で初期化します。
  • コード行 4: 「プログラムが開始されました」というステートメントを出力します。
  • コード行 5: 'mark' が 1 以上であるかどうか、condition70 をチェックします。
  • コード行 7: 条件 1 が失敗したため、条件 2 '70>mark>=40' がチェックされます。
  • コード行 8: condtition2 が返します。 したがって、「グレード B」というメッセージが表示されます。
  • コード行 12: 「プログラムが完了しました」というステートメントを出力します。
  • この場合、コントローラーが返す条件を 3 つ見つけたため、条件 35 の「マーク < 3」はスキップされます。 条件XNUMXの前。

コード出力:

Program started.
Grade B
Program completed.

: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;
/

コードの説明:

  • コード行 2: 変数 'mark' を 'NUMBER' データ型として宣言し、値 '25' で初期化します。
  • コード行 4: 「プログラムが開始されました」というステートメントを出力します。
  • コード行 5: 条件 1、'mark' が 70 以上かどうかをチェックします。
  • コード行 7: 条件 1 が失敗したため、条件 2 '70>mark>=40' がチェックされます。
  • コード行 8: 条件 2 が失敗したため、条件 3 '40>mark>=35' がチェックされます。
  • コード行 11: すべての条件が失敗したため、制御は ELSE ブロックの存在をチェックし、ELSE ブロックから「No Grade」というメッセージを出力します。
  • コード行 14: 「プログラムが完了しました」というステートメントを出力します。

コード出力:

Program started.
No Grade 
Program completed.

NESTED-IF ステートメント

  • NESTED-IF ステートメントは基本的に、プログラマが XNUMX つ以上の 'IF' 条件を別の 'IF' 条件の中に置くことができます。 通常の発言以外。
  • 各「IF」条件には、その特定の範囲の終了を示す個別の「END IF」ステートメントが必要です。 。
  • 「IF」ステートメントは、最も近い「END IF」ステートメントをその特定の条件のエンドポイントと見なします。
  • NESTED-IF の図を下の図に示します。

NESTED-IF ステートメント

NESTED-IF ステートメント

IF <conditionl: 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_blockl ends>
END IF; —END IF corresponds to condition1

構文の説明:

  • 上記の構文では、外側の IF のアクション ブロックにもう XNUMX つの IF ステートメントが含まれています。
  • 条件 1 が返されます、その後、コントロールが実行されます条件を確認します1。
  • 条件 2 も返される場合、 それからも実行されます。
  • 条件 2 の場合、次のように評価されます。 その場合、SQL は次の部分をスキップします。 。

ここでは、入れ子になった If の例を見ていきます。

ネストされた If ステートメントの例: XNUMX つの数値の最大値

この例では、Nested-If ステートメントを使用して、10,15 つの数値のうち最大のものを出力します。以下のコードでわかるように、数値は宣言部分で割り当てられます (つまり、Number= 20、XNUMX、XNUMX)。最大値は、Nested-if ステートメントを使用して取得されます。

DECLARE 
a NUMBER :=10; 
b NUMBER :=15; 
c NUMBER :=20;
BEGIN
dbms_output.put_line(‘Program started.' );
IF( a > b)THEN
/*Nested-if l */
	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;
/

コードの説明:

  • コード行 2: 変数 'a' を 'NUMBER' データ型として宣言し、値 '10' で初期化します。
  • コード行 3: 変数 'b' を 'NUMBER' データ型として宣言し、値 '15' で初期化します。
  • コード行 4: 変数 'c​​' を 'NUMBER' データ型として宣言し、値 '20' で初期化します。
  • コード行 6: 「プログラムが開始されました」というステートメントを出力します (行 6)。
  • コード行 7: 'a' が 'b' より大きいかどうか、条件 1 をチェックします (7 行目)。
  • コード行 10: 「a」が「b」より大きい場合、「nested-if 1」の条件によって「a」が「c」より大きいかどうかがチェックされます (行 10)。
  • コード行 13: それでも「a」の方が大きい場合は、「A が最大です」というメッセージが出力されます (行 11)。 それ以外の場合、条件 2 が失敗した場合は、「C が最大です」と出力されます (13 行目)。
  • コード行 18: 条件 1 が false を返す場合、'nested-if 2' の条件は 'b' が 'c' より大きいかどうかをチェックします (18 行目)。
  • コード行 21: 'b' が 'c' より大きい場合、メッセージ 'B が最大です' が出力され (19 行目)、条件 2 が失敗した場合は 'C が最大です' が出力されます (21 行目)。
  • コード行 24: 「プログラムが完了しました」というステートメントを出力します (行 24)。

コードの出力:

Program started.
Checking Nested-IF 2
C is greatest
Program completed.

まとめ

この章では、さまざまな意思決定ステートメントとその構文と例について学習しました。 以下の表は、これまで説明してきたさまざまな条件ステートメントの概要を示しています。

タイプ DESCRIPTION USAGE
IF-THEN ブール条件をチェックし、TRUE の場合、「THEN」ブロック内のコードが実行されます。 スキップするには、条件に基づいて特定のコードを実行します。
イフ・ザ・エルス ブール条件をチェックします。「THEN」ブロック内の TRUE コードが実行される場合は実行され、「ELSE」ブロック内の false コードが実行される場合は実行されます。 「THIS-OR-THAT」の条件に最も適しています。
イフ・ザ・エルシフ ブール条件を順番にチェックします。 TRUE 条件を返すシーケンス内の最初のブロックが実行されます。 シーケンス内のどの条件も TRUE でない場合、「ELSE」ブロック内のコードが実行されます。 以前は、主に XNUMX つ以上の選択肢から選択していました。
入れ子のIF 別の IF-THEN または IF-THEN-ELSIF ステートメント内に XNUMX つ以上の IF-THEN または IF-THEN-ELSIF ステートメントを許可します。 主にネストされた条件の状況で使用されます。