본문 바로가기
Database/MYSQL

조건문 및 핸들러

by 반화넬 2007. 6. 4.
반응형
17.2.8. 조건문 및 핸들러

17.2.8.1. DECLARE 조건문
DECLARE condition_name CONDITION FOR condition_value
 condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | mysql_error_code
이 명령문은 특정 핸들링을 필요로 하는 컨디션을 표시한다. 이것은 명기된 에러 컨디션이 있는 이름과 관련을 갖는다. 그 이름은 DECLARE HANDLER 명령문에서 순차적으로 사용될 수 있다.  Section 17.2.8.2, “DECLARE Handlers” 참조.

A condition_value 는 SQLSTATE 값 또는 MySQL 에러 코드가 될 수도 있다.

 

17.2.8.2. DECLARE 핸들러
DECLARE handler_type HANDLER FOR condition_value[,...] statement
 
handler_type:
    CONTINUE
  | EXIT
  | UNDO
 
condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | mysql_error_code
DECLARE ... HANDLER 명령문은 핸들러를 지정하는데, 각 핸들러는 하나 또는 여러 개의 컨디션을 다루게 할 수 있다. 만일 이러한 컨디션 중에서 하나가 발생하면, 지정된 statement 가 실행된다. statement 는 단순 명령문이 될 수도 있고(예를 들어, SET var_name = value), 또는 BEGIN 과 END로 쓰여진 복합 명령문이 될 수도 있다. ( Section 17.2.5, “BEGIN ... END 복합 명령문 신텍스” 참조).

CONTINUE 핸들러의 경우, 현 루틴의 실행은 핸들러 명령문의 실행 이후에 진행된다.  EXIT 핸들러의 경우는, 핸들러가 선언된 곳의 BEGIN ... END 복합 명령문을 종료시킨다. (이것은 컨디션이 내부의 블록에서 발생될 경우에도 해당된다.) UNDO 핸들러 타입 명령문은 아직 지원되지 않는다.

만일 어떠한 핸들러도 선언되지 않은 상태에서 컨디션이 발생하면, 디폴트로 EXIT 핸들러가 실행된다.

 condition_value 는 아래의 값 중에서 한가지가 될 수 있다:

SQLSTATE 값 또는 MySQL 에러 코드.
DECLARE ... CONDITION 으로 이전에 표시된 컨디션 이름. Section 17.2.8.1, “DECLARE Conditions” 참조.
SQLWARNING 은 01로 시작되는 모든 SQLSTATE 코드의 축약형임.
NOT FOUND 는 02로 시작되는 모든 SQLSTATE 코드의 축약형임.
SQLEXCEPTION 은 SQLWARNING 또는 NOT FOUND 가 찾지 못하는 모든SQLSTATE 코드에 대한 축약형임.
예제:

mysql> CREATE TABLE test.t (s1 int,primary key (s1));
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter //
 
mysql> CREATE PROCEDURE handlerdemo ()
    -> BEGIN
    ->  DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
    ->  SET @x = 1;
    ->  INSERT INTO test.t VALUES (1);
    ->  SET @x = 2;
    ->  INSERT INTO test.t VALUES (1);
    ->  SET @x = 3;
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> CALL handlerdemo()//
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @x//
    +------+
    | @x  |
    +------+
    | 3    |
    +------+
    1 row in set (0.00 sec)
위의 예제는 SQLSTATE 23000과 관련된 핸들러이며, 이것은 이중(double) 키 에러를 발생시킨다. @x 는 3이 되며, 이것은 MySQL이 프로시저의 마지막에 실행됨을 보여주는 것이다. 만일DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; 이 표시되지 않으면, MySQL은 두 번째 INSERT가 PRIMARY KEY 의 제한으로 인해 실패한 후에 디폴트 경로(EXIT)을 실행하게 되며, SELECT @x는 2를 리턴하게 된다.

만일 컨디션을 무시하고자 하면, CONTINUE 핸들러를 빈 블록과 연결해서 선언하면 된다. 예를 들면:

DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;
반응형