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 の図を下の図に示します。
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 ステートメントを許可します。 | 主にネストされた条件の状況で使用されます。 |