FOR LOOP文は基本LOOP文やWHILE LOOP文とは異なり、指定した回数に達するまで、一連の処理を繰り返し実行します。繰り返す回数が明確な場合に便利です。書式は以下の通りです。
FOR <ループカウンタ名> IN [ REVERSE ] <初期値>..<終了値> LOOP ---(1) <処理文> -----------------------------(2) END LOOP;
(1)にあるループカウンタとは、FOR LOOP内で使用できる変数です。任意の文字を利用できます。暗黙的に宣言されるため、「v_no」のように明示的に宣言する必要はありません。
最初にループカウンタに、<初期値>が代入され、1回LOOP処理を行うごとに1ずつループカウンタの値が増えます。ループカウンタの値が<終了値>に達するとLOOP処理を終了します。
では、以下のサンプルプログラムと図3で、FOR LOOP文の記述方法を確認しましょう。
BEGIN FOR i IN 1..2 LOOP DBMS_OUTPUT.PUT_LINE(i); END LOOP; END; / 1 2
サンプルプログラムでは、ループカウンタとしてiを指定しました。ループカウンタの値が2に達するまでの間、DBMS_OUTPUT.PUT_LINEでループカウンタiの値を出力し続けます。
1回目のLOOP処理を終え、2回目に入るとループカウンタiの値は2になります。終了値を2としているため、END LOOPまでの処理を実行するとLOOP処理が終了します。
ループカウンタには通常の変数とは異なる注意点が、幾つかあります。
特定のLOOP処理をスキップするかどうか、制御ができるCONTINUE文を最後に紹介します。
CONTINUE文はOracle Database 11g Release1で、PL/SQLに追加されました。CONTINUE文内で条件を指定し、条件に合致した場合、END LOOPまでの処理をスキップします。そして、ループの開始地点に制御を移し、次のLOOP処理に進みます。ループを抜けてしまうのではありません。
実際にサンプルプログラムと図4で動作と記述方法を確認しましょう。
BEGIN FOR i IN 1..3 LOOP CONTINUE WHEN i = 2; DBMS_OUTPUT.PUT_LINE(i); END LOOP; END; / 1 3
このプログラムでは、「CONTINUE WHEN i = 2」となっているため、ループカウンタiが2(つまり2回目のLOOP処理)の場合にEND LOOPまでの処理をスキップします。実行結果を見ると、ループカウンタの値2が表示されていません。確かに2回目のLOOP処理をスキップしていることが分かります。
このように、CONTINUE文は特定の値に対して処理を行いたくない場合に便利です。
次回は、データベースから取り出したデータを処理するために必要な「カーソル」を解説します。
株式会社アシスト データベース技術本部所属。
普段はOracle、PostgreSQL、JP1などの分野で研修講師を担当。また、書籍「SQL逆引き大全363の極意」(株式会社秀和システム)をはじめ、「これならわかるOracle超入門教室」(株式会社翔泳社)、「プロとしてのPL/SQL入門」(SBクリエイティブ株式会社)の共著も担当。
Copyright © ITmedia, Inc. All Rights Reserved.