PL/SQL の制御構造(CASE 〜 WHEN 文)
PL/SQL において比較的最近になって実装された選択制御構造が CASE 文である。CASE 文は Oracle 9i から使用できる。CASE 文の使用により見た目にも処理的にもスッキリとした条件文となる。⇔ SQL の CASE 式
条件テスト CASE 文 による条件分岐
CASE 文は SQL 文中に書くことができる CASE 式 と基本的には同じである。2種類の記法がある。
ちなみに CASE 文と CASE 式の簡単な違いは、CASE 文はステートメント処理を記述する文であり、CASE 式は 1 つの値を戻す式(関数のようなもの)である。
単純 CASE 文 (simple case statement)
ある式の値を元に分岐するもの
単純 CASE 文は、IF の羅列や SELECT をともなう DECODE 関数を使用するより見やすく、さらに高速に動作する。
CASE expr
WHEN comparison_expr1 THEN statement1
WHEN comparison_expr2 THEN statement2
ELSE default_statement
END CASE ;
C 言語などのように、フォールスルー(※)は行なわれず、処理は必ず break する。
単純 CASE 文 を 汎用的な IF 文 で表現するなら以下のように 必ず expr1 = expr2 の形式となる。
-- PL/SQL の IF 構文ではない
IF (expr = comparison_expr1) THEN
statement1
ELSE IF (expr = comparison_expr2) THEN
statement2
ELSE THEN
default_statement
END IF;
(※) フォールスルー(fall through) :落としこみ、通り抜け?。
上記の例の場合では comparison_expr1 をフォールスルーにした場合
IF (expr = comparison_expr1) THEN
statement1
END IF;
IF (expr = comparison_expr2 OR expr = comparison_expr1) THEN
statement2
ELSE THEN
default_statement
END IF;
のように、expr = comparison_expr1 の場合には statement1 を実行した後も継続して処理を下に落として statement2 も実行すること。(くどいですが、 PL/SQL における CASE 文にはフォールスルーはない)
検索 CASE 文(searched case statement)
評価する式が個々に違うもの ( expr1 = expr2 の形式にならなくても良い )
式 expr の有無と 式 comparison_expr1 なのか 条件文 condition1 なのかで微妙に違っているので 単純 CASE 文と良く比較してみてください。 condition1 には expr1 比較演算子 expr2 などの記述ができる。
CASE
WHEN condition1 THEN statement1
WHEN condition2 THEN statement2
ELSE default_statement
END CASE ;
IF 文で表現するなら
IF (condition1) THEN
statement1
ELSE IF (condition2) THEN
statement2
ELSE THEN
default_statement
END IF;
他にも condition1 には、IS NULL や IN 、LIKE など記述も可能
PL/SQL と CASE
PL/SQL および 埋め込みSQL に CASE 式が使用できるのは Oracle 9i 以上 (※)
(※) Oracle 9i より以前の PL/SQL パーサは SQL パーサと異なっている。そのために 埋め込みSQL において一部の SQL 構文がサポートされていない。 (Oracle 9i 以降はパーサが統合されている)
CASE 文に関連する事項