PL/SQLの実行部「IF」文、「CASE」文、「GOTO」文、「NULL」文の書き方:超入門「PL/SQL」(4)(1/2 ページ)
本連載は、「PL/SQL(Procedure Language/Structured Query Language)」を理解し、活用していくための実践講座です。今回から「PL/SQLの実行部の書き方」を順に解説していきます。
本連載は、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)
(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
このプログラムは、変数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)
(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句で選択子式として変数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'); (略)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- DBエンジンを最大限に生かすバッチアプリの作り方
第1回では、バッチアプリケーションを設計するうえで考慮すべき4つのポイントについて解説しました。今回は、Oracleデータベースを最大限に利用したバッチアプリケーションの実装テクニックについて解説します。 - ODTを使ったVisual StudioからのPL/SQL開発
オラクル社が提供する3つの.NET環境用開発ツール「ODP.NET」「ODT」「ODE.NET」。Oracle 10gリリース2に対応した最新版を使って、Oracleデータベースを前提とした.NETアプリケーションの開発手法を解説する。(編集部) - 更新/挿入/削除のSQLを高速化する3つの技とは?
本連載では、Oracleデータベースのパフォーマンス・チューニングの中から、特にSQLのチューニングに注目して、実践レベルの手法を解説する。読者はOracleデータベースのアーキテクチャを理解し、運用管理の実務経験を積んでいることが望ましい。対象とするバージョンは現状で広く使われているOracle9iの機能を基本とするが、Oracle 10gで有効な情報も随時紹介していく。(編集局) - 【Oracle Database】忘れていませんか? 「アラートログ調査」に必要な、たった3つのキホン
データベース管理システムの運用でトラブルが発生したらどうするか。データベースサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は基本編として「アラートログの調査で押さえるべき3つのポイント」を解説します。【Oracle Database 12c対応版】