MySQL의 저장 프로시저(Stored Procedure)에는 다른 프로그래밍 언어처럼 FOR 문이 직접 제공되지 않습니다. 대신 LOOP, LEAVE, ITERATE 구문을 조합하여 FOR LOOP와 동일한 반복 처리를 구현할 수 있습니다.
기본 문법
MySQL 저장 프로시저에서 FOR LOOP 형태의 반복문을 작성하는 기본 문법은 다음과 같습니다.
delimiter //
CREATE procedure yourProcedureName()
wholeblock:BEGIN
DECLARE anyVariableName1 INT;
DECLARE anyVariableName3 INT;
DECLARE anyVariableName2 VARCHAR(255);
SET anyVariableName1 = 1;
SET anyVariableName3 = 10;
SET anyVariableName2 = '';
loop_label: LOOP
IF anyVariableName1 > anyVariableName3 THEN
LEAVE loop_label;
END IF;
SET anyVariableName2 = CONCAT(anyVariableName2, anyVariableName1, ',');
SET anyVariableName1 = anyVariableName1 + 1;
ITERATE loop_label;
END LOOP;
SELECT anyVariableName2;
END
//
실제 구현 예제
이제 위 문법을 실제로 적용해 보겠습니다. 1부터 10까지 반복하며 결과를 문자열로 누적하는 저장 프로시저를 생성하는 쿼리는 다음과 같습니다.
mysql> delimiter //
mysql> CREATE procedure ForLoop()
-> wholeblock:BEGIN
-> DECLARE start INT;
-> DECLARE maxLimit INT;
-> DECLARE result VARCHAR(255);
-> SET start = 1;
-> SET maxLimit = 10;
-> SET result = '';
-> loop_label: LOOP
-> IF start > 10 THEN
-> LEAVE loop_label;
-> END IF;
-> SET result = CONCAT(result, start, ',');
-> SET start = start + 1;
-> ITERATE loop_label;
-> END LOOP;
-> SELECT result;
-> END
-> //
Query OK, 0 rows affected (0.37 sec)
mysql> delimiter ;
주요 구문 설명
- LOOP ... END LOOP: 무한 반복 블록을 정의합니다. 조건을 직접 검사해 종료해야 합니다.
- LEAVE loop_label: 지정한 라벨의 반복문을 즉시 빠져나갑니다. 일반적인 언어의
break와 유사합니다. - ITERATE loop_label: 이번 반복을 종료하고 다음 반복으로 넘어갑니다.
continue역할을 합니다. - IF 조건 THEN LEAVE: 시작 값이 최대 한도를 초과하면 반복을 종료하여 FOR 문처럼 동작하게 만듭니다.
저장 프로시저 호출하기
위 예제는 1부터 10까지 숫자를 쉼표로 구분된 형태(1,2,3,...,10)로 출력합니다. 생성한 저장 프로시저는 CALL 명령으로 실행할 수 있습니다.
call yourStoredProcedureName();
실제 호출 쿼리는 다음과 같습니다.
mysql> call ForLoop();
실행 결과
+-----------------------+
| result |
+-----------------------+
| 1,2,3,4,5,6,7,8,9,10, |
+-----------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
이처럼 MySQL에서는 LOOP와 LEAVE를 활용하면 FOR LOOP와 동일한 효과를 얻을 수 있습니다. 반복 횟수가 정해진 경우 위 예제처럼 카운터 변수와 조건문을 함께 사용하는 것이 가장 일반적인 패턴입니다.