ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Stored Procedure] 9. 저장 프로시저 에서의 반복
    프로그래밍/MySQL 2016. 8. 3. 11:14
    반응형

    요약: 이번 강좌에서는 조건에 맞는 코드를 반복해서 실행하게 하는 다양한 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

    반응형

    댓글 0

Designed by Tistory.