MySQL에서는 REPEAT 문을 사용해 저장 프로시저 내부에 루프를 구현할 수 있습니다. 이 글에서는 저장 프로시저와 REPEAT 루프를 활용해 1부터 지정한 값까지 순차적으로 출력하는 방법을 단계별로 살펴보겠습니다.
1. 저장 프로시저 생성하기
먼저 DELIMITER 명령으로 구분자를 변경한 뒤, REPEAT 루프가 포함된 저장 프로시저를 생성합니다.
mysql> DELIMITER //
mysql> CREATE PROCEDURE do_WhileDemo(LastValue INT)
-> BEGIN
-> SET @loop = 0;
-> REPEAT
-> SET @loop = @loop + 1;
-> SELECT @loop;
-> UNTIL @loop > LastValue
-> END REPEAT;
-> END //
Query OK, 0 rows affected (0.17 sec)
mysql> DELIMITER ;
코드 설명
- DELIMITER // — 저장 프로시저 본문의 세미콜론(;)이 SQL 문 종료로 해석되지 않도록 구분자를 임시로 변경합니다. 작업이 끝나면 원래대로 되돌려야 합니다.
- SET @loop = 0; — 루프 카운터로 사용할 사용자 변수 @loop를 0으로 초기화합니다.
- REPEAT ~ UNTIL — 조건이 참이 될 때까지 본문을 반복 실행하는 사후 판정(post-test) 루프입니다. 조건과 관계없이 최소 한 번은 반드시 실행됩니다.
- SET @loop = @loop + 1; — 반복할 때마다 카운터를 1씩 증가시킵니다.
- SELECT @loop; — 현재 카운터 값을 결과로 출력합니다.
- UNTIL @loop > LastValue — 카운터가 매개변수로 전달된 LastValue보다 커지면 루프를 종료합니다.
2. 저장 프로시저 호출하기
생성된 프로시저는 CALL 명령어로 호출합니다. 여기서는 10을 인자로 전달했습니다.
mysql> CALL do_WhileDemo(10);
3. 실행 결과
실행하면 반복할 때마다 @loop 변수의 값이 하나씩 증가하며 순차적으로 출력됩니다.
+-------+ | @loop | +-------+ | 1 | +-------+ | 2 | +-------+ | 3 | +-------+ ... (중간 생략: 4~9 출력) +-------+ | 10 | +-------+ | 11 | +-------+ Query OK, 0 rows affected (0.10 sec)
주목할 점은 마지막에 11까지 출력된다는 것입니다. REPEAT 루프는 조건을 블록 끝에서 검사하기 때문에, @loop가 10일 때 '10 > 10'은 거짓이므로 한 번 더 실행되어 11이 출력된 후에야 루프가 종료됩니다. 이러한 동작 방식을 이해하고 있으면 의도치 않은 결과를 예방할 수 있습니다.
마무리
이처럼 MySQL의 REPEAT 문은 저장 프로시저 안에서 간단하게 반복 작업을 처리할 수 있는 유용한 도구입니다. 조건을 먼저 검사하는 WHILE 문, LEAVE로 탈출하는 LOOP 문과 함께 비교해 보고, 업무 로직에 맞는 루프 방식을 선택해 활용하시기 바랍니다.