PL/SQLの実行部「IF」文、「CASE」文、「GOTO」文、「NULL」文の書き方超入門「PL/SQL」(4)(1/2 ページ)

本連載は、「PL/SQL(Procedure Language/Structured Query Language)」を理解し、活用していくための実践講座です。今回から「PL/SQLの実行部の書き方」を順に解説していきます。

» 2017年09月06日 05時00分 公開
[小笠原宏幸株式会社アシスト]

連載バックナンバー

 本連載は、Oracle Database向けにデータベース言語 SQL(Structured Query Language)を拡張したプログラミング言語である「PL/SQL(Procedure Language/Structured Query Language)」を理解し、活用していくための実践講座です。SQLは知っているけれど、OracleでのPL/SQLは初めてという人向けに、機能の概要と具体的な書き方を解説していきます。

 PL/SQLは「宣言部」「実行部」「例外処理部」で構成されるプログラムであることは前回までに解説しました。今回からは、PL/SQLで実行したい具体的な処理を記述する「実行部」を解説していきます。

 実行部にはさまざま手続き処理を記述できます。その中でも次の3つの制御機能を理解すると、プログラミングの幅が大きく広がります。

  • 条件制御:IF文、CASE文
  • 順次制御:GOTO文、NULL文
  • 反復制御:LOOP文

 これらを順に解説していきます。

条件制御:IF文

 IF文は、条件に応じて処理を分岐したいときに使います。書式は以下の通りです。

IF <条件式> THEN <処理文>;  ------------(1)
[ ELSIF <条件式> THEN <処理文>; ]  -----(2)
[ ELSE <処理文>; ]  --------------------(3)
END IF;  -------------------------------(4)
IF文の書式

 (1)で、1つ目の<条件式>と<処理文>を指定します。IF句の後の<条件式>に合致した場合は、THEN句以降の<処理文>が実行されます。なお、<条件式>はSQLのWHERE句と同様の書式で指定します。

 (2)で、2つ目以降の<条件式><処理文>を指定します。ELSIF句は必要に応じて複数指定できます。

 (3)で、(1)と(2)の条件には合致しない「その他」に対する<処理文>をELSE句で指定します。

 (4)で、IF文の終了を宣言します。

 IF文を使ったサンプルプログラムは以下の通りです。

DECLARE
  v_no NUMBER(8) := 2;
BEGIN
  IF    v_no = 1
    THEN DBMS_OUTPUT.PUT_LINE('代入されている値は1');
  ELSIF v_no = 2
    THEN DBMS_OUTPUT.PUT_LINE('代入されている値は2');
  ELSIF v_no = 3
    THEN DBMS_OUTPUT.PUT_LINE('代入されている値は3');
  ELSE
    DBMS_OUTPUT.PUT_LINE('代入されている値は1-3を除く');
  END IF;
END;
/
代入されている値は2
IF文のサンプルプログラム

 このプログラムは、変数v_noに代入されている値を評価し、その結果に応じて処理を分岐するものです。

 まずIF句で1つ目の条件(変数の値が1だった場合)を指定し、条件に合致した場合はTHEN句で任意の文字列を表示するように指定しています。続いて、ELSIF句に2つ目と3つ目の条件(変数の値が2だった場合と、3だった場合)を指定しています。続いて、ここまで指定した3つの条件に合致しない“その他”(変数の値が1〜3ではない場合)に対してELSE句で処理内容を指定しています。最後に「END IF」を入れ、IF文を終了します。

 ちなみに、IF文に条件を複数記述した場合は上から順に評価されます。条件に合致してTHEN以下の処理が行われると、IF文は終了します。例えばこのプログラムでは、1つ目のELSIF句で条件に合致したため、それ以降の条件(8行目以降)は評価されずにIF文が終了します。このように、条件を複数指定する場合には指定する順序に気を付けるようにしてください。

条件制御:CASE文

 CASE文は、条件が等価評価(「=」)の場合、IF文と比べてソースコードを簡略化できるメリットがあります。書式は以下の通りです。

CASE <選択子式>  -----------------------(1)
WHEN <条件値> THEN <処理文>;   ---------(2)
[ WHEN <条件値> THEN <処理文>; ]  ------(3)
ELSE <処理文>;  ------------------------(4)
END CASE;  -----------------------------(5)
CASE文の書式

 (1)で、CASE句の<選択子式>に、評価対象(変数など)を指定します。

 (2)でWHEN句に選択子式と比較する値を指定します。合致した場合はTHEN句以降の<処理文>が実行されます。

 (3)で、複数の値を評価する場合は、その分だけWHEN句を指定します。

 (4)で(2)と(3)の値には合致しない「その他」に対する<処理文>をELSE句で指定します。IF文とは異なり、ELSE句の指定は必須です。

 (5)CASE文の終了を宣言します。

 前述したIF文のサンプルプログラムをCASE文に書き換えてみます。

DECLARE
  v_no NUMBER(8) := 2;
BEGIN
  CASE v_no
    WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('代入されている値は1');
    WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('代入されている値は2');
    WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('代入されている値は3');
    ELSE        DBMS_OUTPUT.PUT_LINE('代入されている値は1-3を除く');
  END CASE;
END;
/
代入されている値は2
CASE文のサンプルプログラム

 まずCASE句で選択子式として変数v_noを指定しています。その後、WHEN句に比較する値とTHEN句で合致した場合の処理文をそれぞれ指定しています。

 CASE文は条件式を1つ1つ指定する必要がないために、IF文よりシンプルに記述できます。また、CASE文では必須となるELSE句で、その他の値に対する処理文を指定しています。最後にEND CASEを指定し、CASE文を終了しています。

 CASE文では等価評価以外にも、「>」や「>=」などの演算子も使えます。こちらは検索CASE文と呼ばれます。ただこの場合はIF文と同じような記述方法となるために、ソースコードを簡略化できるメリットはありません。

(略)
BEGIN
  CASE
    WHEN v_no = 1 THEN DBMS_OUTPUT.PUT_LINE('代入されている値は1');
    WHEN v_no = 2 THEN DBMS_OUTPUT.PUT_LINE('代入されている値は2');
(略)
等価評価以外の演算子を使う場合
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。