Oracle PL/SQLのループ文のサンプル(LOOP,WHILE)

OracleのPL/SQLのループ文のサンプルです。

確認環境
・Oracle Express Edition 11g Release 2

目次

サンプル 条件でループを抜ける(LOOP文)
  select文で取得した件数分ループする
  決まった回数繰り返す(FOR文)
  配列の数分繰り返す(FOR文)
  最初に条件の判定をする(WHILE文)

条件でループを抜ける(LOOP文)

LOOP
  IF 条件 THEN
     EXIT;
  END IF;
END LOOP;

条件でループを抜けるサンプルです。

create or replace procedure TEST1
IS
  a NUMBER(10) := 1;
BEGIN
	LOOP  -- ループ処理を開始
		IF a = 3 THEN  -- 変数aが3のときに実施
			EXIT; -- ループを抜ける
		END IF;
		a := a + 1;
	END LOOP;
	DBMS_OUTPUT.PUT_LINE('cnt=' || a); -- 3が出力される
END;

5行目のLOOPから10行目のEND LOOPまでループします。
6行目のIF文の条件に合致した場合、7行目のEXITでループ文を抜けます。

select文で取得した件数分ループする

LOOP
   EXIT WHEN カーソル%NOTFOUND;
END LOOP;

select文で取得した件数分ループするサンプルです。

create or replace procedure TEST1
IS
  	CURSOR cur1 IS
		SELECT name,romaji FROM SYAIN
		WHERE id = '99';

	syain_rec cur1%ROWTYPE;
	cnt number(5);
BEGIN
	cnt := 0;
	OPEN cur1;
		LOOP
	    	FETCH cur1 INTO syain_rec; --データを取得
	        EXIT WHEN cur1%NOTFOUND; --NOTFOUNDのときEXITで処理を抜ける

			cnt := cnt + 1; --確認用の変数
		END LOOP;
	CLOSE cur1;

  DBMS_OUTPUT.PUT_LINE('cnt=' || cnt); --取得した件数が出力される
END;

13行目は、FETCH文です。取得したデータをカーソルから変数にセットしています。
14行目は、カーソルのデータがNOTFOUNDのときEXITでループを抜けます。
16行目は、ループの件数を確認する変数です。ループした場合に1が加算されます。

20行目は、取得した件数が出力されます。
select文で取得した件数が0件の場合、0が出力されます。

決まった回数繰り返す(FOR文)

FOR 変数 IN 数値...数値 LOOP
END LOOP;

決まった回数を繰り返すサンプルです。

create or replace procedure TEST1
IS
  a  NUMBER(10) := 0;
  L1 NUMBER(1)  := 3;
BEGIN
	FOR b IN 1..L1 LOOP
		a := a + b;
	END LOOP;
	DBMS_OUTPUT.PUT_LINE('cnt1=' || a); -- 6が出力される
END;

6行目は、bが1,2,3となり、その分繰り返されます。
9行目は、加算されて6になります。

配列の数分繰り返す(FOR文)

FOR 変数 IN 配列名.FIRST..配列名.LAST
LOOP
END LOOP;

配列の数分繰り返すサンプルです。

create or replace procedure TEST1
IS
    TYPE AR1 IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
    c1 AR1;
	a VARCHAR2(200);
BEGIN
	c1(0) := '赤';
	c1(1) := '黄';
	c1(2) := '青';
	a  := '';

    FOR i IN c1.FIRST..c1.LAST
	LOOP
      a := a || c1(i) || ',';
	END LOOP;

    DBMS_OUTPUT.PUT_LINE(a); -- 赤,黄,青,
END;

12行目は、配列.FIRSTと配列.LASTで最初の要素から最後の要素まで繰り返します。

最初に条件の判定をする(WHILE文)

WHILE 条件
LOOP
END LOOP;

最初に条件を判定するサンプルです。

CREATE OR REPLACE FUNCTION TEST1 RETURN VARCHAR2
IS
  a NUMBER(10) := 0;
BEGIN
	WHILE a < 5 
	LOOP
		a := a + 1;
	END LOOP;
	RETURN a;-- 5が出力される
END;

5行目は、ループ処理に入る前に条件の判定があります。
最初の判定で、falseの場合は、ループ処理が1回も行われません。

関連の記事

Oracle PL/SQLのプロシージャのサンプル
Oracle PL/SQLのif文のサンプル

△上に戻る