Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 저장 프로시저에서 FOR LOOP(반복문)를 사용하는 방법

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에서는 LOOPLEAVE를 활용하면 FOR LOOP와 동일한 효과를 얻을 수 있습니다. 반복 횟수가 정해진 경우 위 예제처럼 카운터 변수와 조건문을 함께 사용하는 것이 가장 일반적인 패턴입니다.