본문 바로가기
Database/MYSQL

플로우 컨트롤(Flow Control) 구성

by 반화넬 2007. 6. 4.
반응형
17.2.10. 플로우 컨트롤(Flow Control) 구성

17.2.10.1. IF 명령문
IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF
IF 문장은 기본적인 조건문을 제공한다. 만일search_condition 의 조건에 맞으면, 이에 대응하는 SQL명령문 리스트가 실행된다. 만일 search_condition 의 조건이 일치하지 않으면, ELSE 구문에 있는 명령문 리스트가 실행된다. 각 statement_list 는 한 개 또는 그 이상의 명령문으로 구성된다.

Note: 또한, IF() 함수가 있는데, 여기에서 기술한 IF 명령문과 다른 형태로서,  Section 12.2, “Control Flow Functions”를 참조하기 바람.

 


17.2.10.2. CASE 명령문
CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE
Or:

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE
스토어드 루틴에 대한CASE 명령문은 복합 조건문 구성을 실행한다. 만일 search_condition 의 조건이 일치하면, 이에 대응하는 SQL 명령문 리스트가 실행된다. 만일 일치하는 조건이 없는 경우에는, ELSE구문에 있는 명령문 리스트가 실행된다. 각 statement_list 는 한 개 또는 그 이상의 명령문으로 구성된다.

Note: 스토어드 루틴 내에서 사용하기 위한 CASE statement 의 신텍스는 Section 12.2, “Control Flow Functions”에서 다루는 SQL CASE expression과는 약간 다른 형태이다. CASE 명령문은 ELSE NULL 구문을 가질 수 없으며, 또한 END 대신에 END CASE로 종료를 시킨다.



17.2.10.3. LOOP 명령문
[begin_label:] LOOP
    statement_list
END LOOP [end_label]
LOOP 는 단일 루프 구성을 형성하고, 명령문의 반복 실행을 가능하게 해주며, 한 개 또는 그 이상의 명령문으로 구성 되어진다. 루프안에 있는 명령문은 루프가 종료되기 전까지 계속 반복 실행을 한다; 일반적으로 이 명령문은 LEAVE 명령문과 함께 실행된다.

LOOP 명령문은 레이블화 시킬 수 있고, end_label 는 begin_label 을 표시한 후에 작성해야 한다. 양쪽 모두 표시할 때에는 동일한 이름을 사용해야 한다.



17.2.10.4. LEAVE 명령문
LEAVE label
이 명령문은 모든 레이블화된 플로우 제어 구성문을 빠져 나올 때 사용하는 명령문이다. 이것은 BEGIN ... END , 또는 루프 구성문(LOOP, REPEAT, WHILE)안에서도 사용 가능하다.


17.2.10.5. ITERATE 명령문
ITERATE label
ITERATE 는 LOOP, REPEAT, 및 WHILE 명령문안에서만 사용할 수 있다. ITERATE 는 “루프를 다시 실행(do the loop again)”의 의미이다.

예제:

CREATE PROCEDURE doiterate(p1 INT)
BEGIN
  label1: LOOP
    SET p1 = p1 + 1;
    IF p1 < 10 THEN ITERATE label1; END IF;
    LEAVE label1;
  END LOOP label1;
  SET @x = p1;
END


17.2.10.6. REPEAT 명령문
[begin_label:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [end_label]
REPEAT 명령문 내에 있는 명령문 리스트는 search_condition 의 조건이 일치하는 동안 반복적으로 실행된다. 따라서,  REPEAT 는 항상 적어도 한번은 루프 안에 표현되어야 한다. statement_list 는 한 개 또는 그 이상의 명령문으로 구성된다.

REPEAT명령문은 레이블화 될 수 있다. end_label 는 begin_label 과 함께 표시되어야 한다. 양쪽 모두는 동일한 이름으로 표시되어야 한다.

예제:

mysql> delimiter //
 
mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->  SET @x = 0;
    ->  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> CALL dorepeat(1000)//
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @x//
+------+
| @x  |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)


17.2.10.7. WHILE 명령문
[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]
The statement list within a WHILE 명령문 내에 있는 명령문 리스트는 search_condition 조건이 일치하는 동안 반복적으로 실행된다. statement_list 는 한 개 또는 그 이상의 명령문으로 구성된다.

WHILE 명령문은 레이블화할 수 있다. end_label 은 begin_label 과 함께 표시되어야 하고, 양쪽은 모두 동일한 이름을 사용하여야 한다.

예제:

CREATE PROCEDURE dowhile()
BEGIN
  DECLARE v1 INT DEFAULT 5;
 
  WHILE v1 > 0 DO
    ...
    SET v1 = v1 - 1;
  END WHILE;
END





IF, CASE, LOOP, WHILE, REPLACE ITERATE, 및 LEAVE 구성문은 모두 실행할 수 있다.

대부분의 이러한 구성문은 다른 명령문을 포함하고 있는데, 아래의 색션에서 열거하는 문법에 의해 구성 되어진다. 이런 구성문들은 네스티드(nested)될 수 있다. 예를 들면, 하나의 IF 명령문은 WHILE 루프를 포함할 수 있고, 이 루프는 자체적으로 CASE 명령문을 가질 수 있다.

FOR는 아직 지원되지 않는다.
반응형