DB2 흐름 제어 : 이동 제어 ITERATE, GOTO, RETURN
1. 이동 제어 : ITERATE
ITERATE 문은 LOOP 문, WHILE 문, REPEAT 문, FOR 문 등 반복 제어의 시작 부분으로 이동할 때에 사용한다.
ITERATE 레이블명
JAVA 의 CONTINUE 와 유사한 기능으로 특정한 조건을 만족하는 경우 시작 부분으로 돌아가게 되고, 그 이후 문장은 실행하지 않게 된다.
2. 이동 제어 : GOTO
GOTO 문은 사용자가 임의로 정의한 레이블이 있는 위치로 이동한다.
이 때 지정 가능한 레이블은 동일한 SCOPE 에 있는 레이블만 가능하다.
GOTO 레이블명;
DECLARE V1 INT DEFAULT 10;
IF (V1 > 5) THEN
SET V1 = V1 * 2;
GOTO exit;
END IF;
SET V1 = V1 + 100;
exit :
SET V1 = V1 - 5;
위의 코드를 실행하는 과정을 살펴보자.
먼저 V1 은 기본값으로 10 이 주어지게 된다.
이로 인하여 IF 문의 조건이 참으로 평가되고 SET 문이 실행되어 V1 에는 20 이라는 새로운 값이 할당된다.
그 이후에 GOTO 문을 만나게 되고 GOTO 문에는 exit 라는 레이블이 작성되어 있다.
해당하는 이름이 있기 때문에 IF 문에서 exit 을 실행하러 간다.
즉, SET V1 = V1 + 100; 은 실행되지 않고 SET V1 = V1 - 5; 가 실행되어 V1 이 15 가 된다.
GOTO 문은 내부 블록에서 외부 블록으로의 이동은 가능하지만, 내부 블록에서 외부 블록으로는 이동이 불가능하다는 특징을 가진다.
3. 이동 제어 : RETURN
RETURN 문은 프로시저와 함수를 종료할 때에 사용된다.
프로시저에서는 프로시저의 리턴 상태를 나타내는 정수값이 반환되고, 함수에서는 함수의 결과가 반환된다.
프로시저에서의 RETURN 문에서는 다음과 같이 반환값을 지정한다.
RETURN [상수 | 변수 | 수식]
값을 지정하지 않은 경우에는 기본값으로써 0이 지정된다.
CREATE PROCEDURE PS1 (IN P1 INTEGER, OUT P2 DATE)
BEGIN
SET P2 = CURRENT_DATE - P1 MONTH - P1 DAY;
RETURN 99;
END @
CALL PS1(2, ?) @
위의 예문에서 PS1 이라는 프로시저를 정의하였다.
프로시저의 내용은 출력매개변수에 대하여 날짜 유형의 값을 입력매개변수 P1 을 활용하여 할당하고,
RETURN 문을 통해 리턴 상태값을 99 로 반환하는 것이다.
P1 으로 값이 2 를 넘겼기 때문에 현재 날짜를 2022-12-01 로 가정한다면 2달 전, 2일 전 으로 값이 나타나게 된다.
이때의 RETURN 문에는 NULL 값을 직접 지정하거나 또는 SELECT 문을 지정할 수 없다.
스칼라 함수에서는 좀 더 다양한 반환값을 가진다.
RETURN {NULL | 상수 | 변수 | 수식 | SELECT 문| VALUES 문}
다만, 반환값은 함수에서 정의한 반환값의 데이터 유형과 호환이 가능한 값이어야 한다.
그리고 SELECT 문과 VALUES 문은 한 개의 컬럼으로 구성된 한 건 이하의 레코드만을 반환해야 한다.
CREATE OR REPLACE FUNCTION FN1 (P1 INTEGER)
RETURNS VARCHAR(10)
BEGIN ATOMIC
IF (P1 > 400) THEN
RETURN 'TOO HIGH';
ELSEIF (P1 > 300) THEN
RETURN TRUNC(P1 - 2);
ELSE
RETURN NULL;
END IF;
END @
SELECT XNO, XNAME, XMONEY, FN1(XMONEY)
FROM TABLE_X @
위의 예시에서 정의한 함수는 RETURN 문으로 VARCHAR 유형의 값을 반환하도록 하였다.
함수를 사용할 때에 XMONEY 컬럼의 데이터를 활용하도록 지정하였기 때문에 해당 값에 따라
IF 문을 거치게 되고 조건문에 따라 문자 상수, 수식, NULL 등을 반환하게 된다.
테이블 함수에서는 다음과 같다.
RETURN { SELECT 문 | VALUES 문 }
이때 반환할 결과집합은 함수에 정의된 반환 테이블과 동일한 구조여야 하고,
결과 컬럼의 값은 마찬가지로 반환 테이블에 정의된 컬럼의 데이터 유형과 호환되는 값이어야 한다.
CREATE OR REPLACE FUNCTION FN1(P1 INTEGER)
RETURNS TABLE(XNO, XNAME, XMONEY)
RETURN
SELECT XNO, XNAME, XMONEY
FROM TABLE_X
WHERE XMONEY > P1
@
SELECT TABLE_Y.* FROM TABLE(FN1(300)) TABLE_Y WHERE XNO < 50 @
위의 예문에서 사용한 테이블 함수에서는 RETURN 문을 이용하여 N 개의 컬럼으로 구성된 0 건 이상의 레코드를 반환하는 SELECT 문을 지정할 수 있다.
이를 활용하여 P1 이라는 매개변수를 입력받고, XNO, XNAME, XMONEY 를 컬럼으로 하는 테이블을 반환하는 테이블 함수를 만들었다.