PL/SQL の制御構造 条件分岐 IF 〜 THEN 〜 ELSE
プログラミングの制御構造には、「選択」、「反復」、「順次」と3つの基本的な制御構造がある。
PL/SQL における 「選択制御構造」 (条件分岐:条件テスト)は、IF 文 と CASE 文。
「反復」 ⇒ FOR、WHILE、LOOP
「順次」 ⇒ GOTO、NULL
(※) GOTO は反復制御としても使用することができる。
SQL 文の中における IF 相当は ⇒ SQL の IF 「CASE 〜 WHEN 式」 を参照
条件テスト 〜 IF ELSE 文
PL/SQL の条件文は IF と CASE 文 () が用意されている。
IF ELSE 文による条件分岐
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 vNum NUMBER := 10;
3 vMsg VARCHAR2(255);
4 BEGIN
5 -- 条件はイコール1つで評価する。
6 -- IF 〜 THEN までの文末のセミコロン(;)は不要
7 IF (vNum = 1) THEN
8 vMsg := '数値は1です';
9
10 -- ELSE IF ではなく ELSIF と書く (※ ELSEIF ではない)
11 ELSIF (vNum = 5) THEN
12 vMsg := '数値は5です';
13
14 -- ELSE の場合には THEN を書いてはいけない
15 ELSE
16 vMsg := '数値は1でも5でもありません';
17
18 -- IF 文の終わりは END IF ;
19 END IF;
20
21 DBMS_OUTPUT.PUT_LINE(vMsg);
22 END;
23 /
数値は1でも5でもありません
PL/SQLプロシージャが正常に完了しました。
文字列同士の比較(参考: 文字列比較セマンティクス)
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 vStr VARCHAR2(10);
3 vMsg VARCHAR2(255);
4 BEGIN
5 vStr := 'abc'; -- 本文中で代入
6 --
7 -- 文字列の場合でも、そのまま評価できる。
8 IF (vStr = 'abc') THEN
9 DBMS_OUTPUT.PUT_LINE('文字列は abc です');
10 END IF;
11 --
12 -- ※ 条件式の括弧は必須ではありません
13 IF FALSE THEN
14 DBMS_OUTPUT.PUT_LINE('条件式の括弧は無くても大丈夫です');
15 END IF;
16 END;
17 /
文字列は abc です
PL/SQLプロシージャが正常に完了しました。
IF 文における注意ポイント
- IF、ELSIF には THEN を記述すること
- ELSE IF は ELSIF と記述すること
- ELSE は THEN を記述しないこと
- 条件式の前後にある括弧は必須ではない。(あくまで個人的な記述ルールです)
このように PL/SQL の IF 文は非常にクセのある構文である。
噂で聞いた話では、開発者が ELSEIF のつもりだったのが ELSIF だったというスペルミス説。互換性の問題からそのままにした。という話
真偽については確認できていない。しつこく探せば PL/SQL 文法の原型?ともいえる Ada(※) の FAQ としてありそうなネタである。ちなみに ELSE IF と ELSIF ではコンパイラ側からみて空白のありなしによって相当違う。
(※) Ada とは国の防衛関連技術に使用される非常に厳格な開発言語
もともと少ない Ada プログラマ不足で人員の確保が困難な事に加えてプログラマの人材教育も難しいという。
そこで最近では防衛関連のプログラム言語に「防衛搭載システム用 リアルタイム Java」 が導入されて主流になるだろうという
事がニュースにもなっている。
⇒ 条件テスト CASE 文 (Oracle 9i 〜) による条件分岐
比較条件の種類