요약: 이번 강좌에서는 조건에 맞는 코드를 반복해서 실행하게 하는 다양한 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 )
'프로그래밍 > MySQL' 카테고리의 다른 글
[Stored Procedure] 11. MySQL에서의 저장 프로시저 리스트 (0) | 2016.08.05 |
---|---|
[Stored Procedure] 10. MySQL Cursor (1) | 2016.08.04 |
[Stored Procedure] 8. IF 문과 CASE문 중 선택하는 팁 (0) | 2016.08.01 |
[Stored Procedure] 7. MySQL CASE 문법 (2) | 2016.07.29 |
[Stored Procedure] 6. MySQL IF 문법 (0) | 2016.07.28 |