PostgreSQL ループ文のサンプル(LOOP,WHILE)

PostgreSQLのPL/pgSQLのループ文のサンプルです。
(確認環境:PostgreSQL 11.2,Windows 10)

目次

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

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

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

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

CREATE OR REPLACE PROCEDURE test1() 
AS $$
DECLARE
  a int;
BEGIN
  a:= 1;
  LOOP
    IF (a = 3) THEN
      EXIT;
    END IF;
    a := a + 1;
  END LOOP;
  RAISE INFO 'cnt=%',a; -- cnt=3が出力される
END;
$$
LANGUAGE plpgsql;

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

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

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

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

CREATE OR REPLACE PROCEDURE test1() 
AS $$
DECLARE
  cur1 CURSOR FOR
	select name from employee;
	employee_rec RECORD;
BEGIN
  OPEN cur1;
  LOOP
    FETCH cur1 INTO employee_rec;
      EXIT WHEN NOT FOUND;
    RAISE INFO '%', employee_rec.name;
  END LOOP;
  CLOSE cur1;
END;
$$
LANGUAGE plpgsql;

10行目は、FETCH文です。取得したデータをカーソルから変数にセットしています。
11行目は、カーソルのデータが存在しない(NOT FOUND)のときEXITでループを抜けます。

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

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

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

CREATE OR REPLACE PROCEDURE test1() 
AS $$
DECLARE
  num1 int; 
BEGIN
  num1:= 3;
  FOR a IN 1..num1 LOOP
     RAISE INFO '%',a; -- 1 2 3が出力される
  END LOOP;
END;
$$
LANGUAGE plpgsql;

7行目は、変数aが1,2,3となり、その分繰り返されます。
8行目は、1,2,3が出力されます。

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

FOREACH 変数 IN ARRAY 配列名
LOOP
  処理
END LOOP;

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

CREATE OR REPLACE PROCEDURE test1() 
AS $$
DECLARE
    c1 VARCHAR(6)[];
	str1 VARCHAR(6);
BEGIN
  c1[0] := 'red';
  c1[1] := 'yellow';
  c1[2] := 'blue';
  
  FOREACH str1 IN ARRAY c1
  LOOP
    RAISE INFO '%',str1; -- red,yellow,blueが出力される
  END LOOP;
END;
$$
LANGUAGE plpgsql;

11行目は、FOREACH文で配列の最初の要素から最後の要素まで繰り返します。

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

WHILE 条件
LOOP
END LOOP;

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

CREATE OR REPLACE PROCEDURE test1() 
AS $$
DECLARE
    num1 int;
BEGIN
  num1 := 0;
  
  WHILE num1 < 5
  LOOP
    num1 := num1 + 1;
  END LOOP;
  RAISE INFO '%',num1; -- 5が出力される
END;
$$
LANGUAGE plpgsql;

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

関連の記事

PostgreSQL if文のサンプル(PL/pgSQL)

△上に戻る