본문 바로가기
프로그래밍/MySQL

[Stored Procedure] 9. 저장 프로시저 에서의 반복

by 듀빈 2016. 8. 3.
반응형

요약: 이번 강좌에서는 조건에 맞는 코드를 반복해서 실행하게 하는 다양한 MySQL Loop 문(WHILE, REPEAT, LOOP) 을 어떻게 사용하는지 배워 볼 것이다.


  MySQL은 반복적으로 조건에 맞는 SQL코드를 실행하게 허용하는 반복문을 제공한다. MySQL에서는 WHILE, REPEAT, LOOP의 반복문이 있다.

우리는 아래 섹션에서 더 상세하게 반복문을 연습해 볼 것이다.


WHILE 반복

WHILE문의 구조는 아래와 같다:

1
2
3
WHILE expression DO
   statements
END WHILE
cs

  WHILE문은 각 반복의 처음에 표현식(expression)을 체크한다. 만약 표현식의 값이 TURE이면 MySQL은 WHILE 문과 END WHILE 문 사이에 있는 식(statement)을 표현식의 값이 FALSE가 될때까지 실행할 것이다. WHILE문은 사전 검사라고 불리운다. 왜냐하면 WHILE문은 식(statement)를 실행하기 전에 표현식(expression)을 검사하기 때문이다.

아래의 흐름도(Flowchart)는 WHILE문 의 동작원리를 설명하고 있다.

아래는 저장 프로시저에서 WHILE문을 사용하는 예시를 보여준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DELIMITER $$
 DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
 CREATE PROCEDURE test_mysql_while_loop()
 BEGIN
 DECLARE x INT;
 DECLARE str VARCHAR(255);
 
 SET x = 1;
 SET str =  '';
 
 WHILE x  <= 5 DO
 SET  str CONCAT(str,x,',');
 SET  x = x + 1; 
 END WHILE;
 
 SELECT str;
 END$$
DELIMITER ;
cs

위의 test_mysql_while_loop 저장 프로시저에서는:

첫 번째로, x변수의 값이 5보다 클 때까지 str 문자열을 반복적으로 추가한다. 그 후, SELECT문을 사용해서 최종 문자열을 표시한다.

  만약 x변수를 초기화 하지 않는다면, x변수의 기본값은 NULL이 된다는 것을 알고 있어야 한다. 그러므로, WHILE문의 조건은 항상 TRUE가 된다. 그리고 무한 반복에 빠지게 된다. 

test_mysql_while_loop 저장 프로시저를 테스트 해봅시다.

1
CALL test_mysql_while_loop();
cs


REPEAT 문

REPEAT 문법의 구조는 아래와 같다:

1
2
3
4
REPEAT
 statements;
UNTIL expression
END REPEAT
cs

첫 번째로, MySQL은 식(statement)를 실행한고, 그 후에 표현식(expression)을 확인한다. 만약 표현식의 값이 FALSE일 경우에 MySQL은 표현식의 결과가 TRUE가 될때 까지 반복적으로 식(statement)를 실행한다. 

왜냐하면 REPEAT문은 식(statement)을 실행한 후에 표현식(expression)을 확인하기 때문이다. 그래서, REPEAT문은 사후 테스트(post-test) 반복문으로 알려져 있다.

아래의 흐름도는 REPEAT 반복문을 설명하고 있다:

우리는 test_mysql_while_loop 저장 프로시저를 재 작성할 것이다. 위의 WHILE 반복문 대신에 REPEAT 반복문을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DELIMITER $$
 DROP PROCEDURE IF EXISTS test_mysql_repeat_loop$$
 CREATE PROCEDURE test_mysql_repeat_loop()
 BEGIN
 DECLARE x INT;
 DECLARE str VARCHAR(255);
 
 SET x = 1;
 SET str =  '';
 
REPEAT SET str = CONCAT(str,x,','); SET x = x + 1; UNTIL x > 5 END REPEAT;
 
 SELECT str;
 END$$
DELIMITER ;
cs

UNTIL 표현식(expression)에서는 세미콜론( ; )을 사용하지 않는것을 알고 있어야 한다.

1
CALL mysql_test_repeat_loop();
cs


LOOP, LEAVE, ITERATE 문

LOOP를 제어할 수 있게 하는 2개의 문법이 있다:

- LEAVE 문은 조건을 만족할 때 까지 기다리지 않고 즉시 반복문을 빠져 나갈 수 있게 허용한다. LEAVE문은 PHP, C/C+, JAVA 와 같은 다른 언어에서 break 처럼 작동한다.

- ITERATE 문은 코드를 전부 실행 시키지 않고 새로운 반복을 시작하도록 한다. ITERATE 문은 PHP, C/C++, JAVA 에서 continue문과 비슷하게 작동한다.

MySQL은 또한 반복 상태의 코드 구간에서 코드를 조금 더 유용성 있게 하는 loop label을 제공한다.

아래는 LOOP 반복문을 사용한 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE PROCEDURE test_mysql_loop()
 BEGIN
  DECLARE x  INT;
  DECLARE str  VARCHAR(255);
        
  SET x = 1;
  SET str =  '';
        
  loop_label: LOOP
  IF x > 10 THEN 
  LEAVE  loop_label;
  END IF;
            
  SET x = x + 1;
  IF (x mod 2) THEN
   ITERATE loop_label;
  ELSE
   SET str = CONCAT(str,x,',');
  END  IF;
  END LOOP;    
 
  SELECT str;
 
 END;
cs

- 저장 프로시저는 짝수(2, 4, 6 등)의 문자열만 나열한다.

- 우리는 LOOP문을 실행하기 전에 loop_label의 이름을 가진 loop label을 배치한다.

- 만약 x의 값이 10보다 크다면  LEAVE문에 의해서 종료 되어진다.

- 만약 x의 값이 홀수 라면, ITERATE문 아래의 모든 것을 무시하고 새로운 반복을 시작한다.

- 만약 x의 값이 짝수 라면, ELSE문의 구간에 짝수만 존재하는 문자열을 만들 것이다.


이번 강좌에서는, 조건에 맞는 코드 구간을 반복적으로 실행하는 다양한 MySQL 반복문에 관해서 배워보았다.


출처 : http://www.mysqltutorial.org/stored-procedures-loop.aspx

이전 글 : [Stored Procedure] 8. IF 문과 CASE문 중 선택하는 팁 ( Hints for Choosing Between IF and CASE Statements )

다음 글 : [Stored Procedure] 10. MySQL Cursor

반응형