[PostgreSQL] 함수: 반복문

plpgsql은 loop, while, for 등의 반복구문을 제공한다.



loop문

loop문은 단순한 반복문이다.
탈출구문 exit를 사용하기 전까지는 무한하게 반복한다.

CREATE FUNCTION FOO4() RETURNS TEXT
AS
$$
DECLARE
i int8 = 0;
foo text = '';
BEGIN
	LOOP
		EXIT WHEN i = 4; -- i가 4면 탈출
		foo := foo || 'foo';
		i := i + 1;
	END LOOP;

	RETURN foo;
END
$$
LANGUAGE PLPGSQL;

그런데 이건 대체로 표현성이 그리 좋진 않다.

이걸 좀더 보기좋기 사용하기 위한게 while과 for이다.
while과 for은 loop문 머리에 추가로 붙이는 형태로 작성된다.



while문

앞에다가 while과 조건식을 붙여놓으면, 조건식이 참인 동안만 반복되는 반복문이 된다.

위의 코드를 while문으로 바꾸면 이렇게 된다.

CREATE FUNCTION FOO5() RETURNS TEXT
AS
$$
DECLARE
i int8 = 0;
foo text = '';
BEGIN
	WHILE i < 4
	LOOP
		foo := foo || 'foo';
		i := i + 1;
	END LOOP;

	RETURN foo;
END
$$
LANGUAGE PLPGSQL;



for in 문

이건 또 범위값을 처리하기 좋은 놈이다.

위의 코드를 for-in으로 바꾸면 이렇게 된다.
0부터 3까지 순회하니, 4번 반복하는 것이다.
그리고 각각의 값은 _라는 변수에 할당되나, 필요없이 때문에 사용하지 않았다.

CREATE FUNCTION FOO6() RETURNS TEXT
AS
$$
DECLARE
foo text = '';
BEGIN
	FOR _ in 0..3
	LOOP
		foo := foo || 'foo';
	END LOOP;

	RETURN foo;
END
$$
LANGUAGE PLPGSQL;

또 for-in문의 장점 중 하나는 select값을 기반으로 반복을 처리할 수도 있다는 것이다.

CREATE FUNCTION FOO7() RETURNS TEXT
AS
$$
DECLARE
n int8 = 0;
foo text = '';
BEGIN
	FOR n in SELECT num FROM test WHERE num <= 100
	LOOP
		foo := foo || n::TEXT;
	END LOOP;

	RETURN foo;
END
$$
LANGUAGE PLPGSQL;

그런데 select값을 받으려면 받는 변수를 declare에서도 선언해야 한다는 제약이 존재한다.
왜 있는지는 모르겠다. 그냥 범위값을 받을때는 필요없다.

배열값같은건 못받는다.
배열을 받을 수 있는건 foreach문이 또 따로 있다.



foreach문

이건 배열값을 받는 것에 특화되어있는 for문이다.

CREATE FUNCTION FOO8() RETURNS TEXT
AS
$$
DECLARE
n int8;
nums int8[] = ARRAY[1, 3, 5, 4, 2];
foo text = '';
BEGIN
	FOREACH n in ARRAY nums
	LOOP
		foo := foo || n::TEXT;
	END LOOP;

	RETURN foo;
END
$$
LANGUAGE PLPGSQL;

그렇다.


참조
http://www.gisdeveloper.co.kr/?p=4621
https://stackoverflow.com/questions/10214392/iterating-over-integer-in-pl-pgsql