MySQL은 코드 블록을 반복적으로 실행할 수 있는 LOOP 문을 제공하며, 루프 레이블(loop label)을 붙일 수 있는 유연성도 함께 갖추고 있습니다. LOOP 문은 시작 부분에서 조건을 검사하지 않기 때문에, 루프의 흐름을 직접 제어하려면 다음 두 가지 문장을 활용해야 합니다.
LEAVE 문
조건 검사를 기다리지 않고 즉시 루프를 빠져나가게 해주는 문장입니다. LEAVE 문이 없으면 루프는 무한히 반복되므로, 종료 조건과 함께 반드시 사용해야 합니다.
ITERATE 문
해당 문 아래에 있는 나머지 코드를 모두 건너뛰고 새로운 반복(iteration)을 시작하게 해주는 문장입니다. 특정 조건에서만 실행하고 싶지 않은 코드를 건너뛸 때 유용합니다.
저장 프로시저 예제: 짝수 문자열 만들기
LOOP 문을 저장 프로시저에서 실제로 어떻게 사용하는지 살펴보겠습니다. 아래 저장 프로시저는 2, 4, 6, 8처럼 짝수들을 이어 붙인 문자열을 생성합니다.
mysql> Delimiter //
mysql> CREATE PROCEDURE LOOP_loop()
-> BEGIN
-> DECLARE A INT;
-> DECLARE XYZ VARCHAR(255);
-> SET A = 1;
-> SET XYZ = '';
-> loop_label: LOOP
-> IF A > 10 THEN
-> LEAVE loop_label;
-> END IF;
-> SET A = A + 1;
-> IF (A mod 2) THEN
-> ITERATE loop_label;
-> ELSE
-> SET XYZ = CONCAT(XYZ,A,',');
-> END IF;
-> END LOOP;
-> SELECT XYZ;
-> END //
Query OK, 0 rows affected (0.07 sec)
프로시저 호출 및 결과 확인
생성된 프로시저를 호출하면 아래와 같은 결과를 확인할 수 있습니다.
mysql> DELIMITER ; mysql> CALL LOOP_loop (); +-------------+ | XYZ | +-------------+ | 2,4,6,8,10, | +-------------+ 1 row in set (0.04 sec) Query OK, 0 rows affected (0.04 sec)
예제 동작 원리 정리
위 쿼리의 흐름을 단계별로 정리하면 다음과 같습니다.
- 변수 A의 값이 10보다 크면 LEAVE 문에 의해 루프가 즉시 종료됩니다.
- A의 값이 홀수라면 ITERATE 문이 그 아래의 모든 코드를 무시하고 새로운 반복을 시작합니다.
- A의 값이 짝수라면 ELSE 블록이 실행되어 해당 숫자가 CONCAT 함수를 통해 문자열 XYZ에 추가됩니다.
이처럼 LOOP 문은 조건 검사 없이 단순 반복이 필요한 경우에 적합하며, LEAVE와 ITERATE 문을 조합하면 반복의 시작·중단·건너뛰기를 자유롭게 제어할 수 있습니다.