本連載は、「PL/SQL(Procedure Language/Structured Query Language)」を理解し、活用していくための実践講座です。今回は「PL/SQLの実行部の書き方」のうち、反復制御(LOOP文)を解説します。
本連載は、Oracle Database向けにデータベース言語 SQL(Structured Query Language)を拡張したプログラミング言語である「PL/SQL(Procedure Language/Structured Query Language)」を理解し、活用していくための実践講座です。SQLは知っているけれど、OracleでのPL/SQLは初めてという人向けに、機能の概要と具体的な書き方を解説していきます。
前回は、PL/SQLの制御機能のうち、条件制御(IF文、CASE文)と順序制御(GOTO文、NULL文)を解説しました。今回はもう1つの制御機能である反復制御(LOOP文)について紹介します。次回解説予定の「カーソル」と併用することが多く、使用頻度が非常に高い機能です。この機会にしっかり習得しましょう。
LOOP文を使用すると、一連の処理を繰り返し実行できます。今回は、以下の3つのLOOP文について解説します。
これらを順に解説していきます。LOOP文と組み合わせて使うCONTINUE文についても触れます。
基本LOOP文は反復制御のうち、最も基本的です。書式は以下の通りです。
LOOP <処理文> -----------------------------(1) <条件式> -----------------------------(2) END LOOP; -----------------------------(3)
(1)で、指定した<処理文>を返し実行します。
(2)で、<条件式>としてLOOP処理の終了条件を指定します。指定しないとLOOP処理が止まらなくなってしまいます。
(3)で、基本LOOP文の終了を宣言します。END LOOPに続けて「;」(セミコロン)が必要です。
(2)の終了条件には指定方法が幾つかあります。今回はEXIT WHEN文を使う方法を解説します。EXIT WHEN文は、SQLのWHERE句と同様の書式で終了条件を指定でき、条件に合致した場合にLOOP処理を終了します。EXIT WHEN文を使用した基本LOOP文のサンプルプログラムは以下の通りです。
DECLARE v_no NUMBER(8) := 0; BEGIN LOOP v_no := v_no + 1; EXIT WHEN v_no = 3; DBMS_OUTPUT.PUT_LINE('TEST'); END LOOP; END; / TEST TEST
サンプルプログラムでは、LOOP〜END LOOP間(4〜8行目)の処理を、終了条件に達するまで繰り返し実行します。指定した文字をDBMS_OUTPUT.PUT_LINEによって出力します。
図1に基本LOOP文の内部動作を示しました。LOOP処理を行う際にEXIT WHEN文によって変数v_noの値を評価し、値が3ならLOOP処理を終了するよう条件を指定しています。
図1では基本LOOP文の終了条件にEXIT WHEN文を使用しましたが、他にEXIT文(処理がこの文に到達すると無条件でLOOP処理を終了)やGOTO文(連載第4回)などを使用できます。
WHILE LOOP文は、LOOPの開始地点で終了条件を指定し、条件に合致するまでLOOP処理を実行します。EXIT WHEN文を使用した基本LOOPと似ていますが、違いがあります。LOOP処理を行う前に条件を判定するため、一度もLOOP処理を実行しない場合があるのです。
WHILE <条件式> LOOP --------------------(1) <処理文> -----------------------------(2) END LOOP;
(1)で、WHILE句の後にある<条件式>に、SQLのWHERE句と同様の書式を用いて終了条件を指定します。(2)の処理文には繰り返し実行したい処理内容を記述します。
以下のサンプルプログラムと図2でWHILE LOOP文の記述方法を確認しましょう。
DECLARE v_no NUMBER(8) := 0; BEGIN WHILE v_no < 2 LOOP v_no := v_no + 1; DBMS_OUTPUT.PUT_LINE('TEST'); END LOOP; END; / TEST TEST
サンプルプログラムでは、変数v_noの値が2より小さい間、LOOP処理を続けるように指定しています。LOOP処理を2回実行すると変数v_noの値が2に達します。すると3回目のLOOP処理の開始地点で終了条件に合致して、LOOP処理を終えます。
Copyright © ITmedia, Inc. All Rights Reserved.