본문 바로가기

MySQL/Stored Procedure

[MySQL / Stored Procedure] 에러 핸들링 (1) DECLARE ... HANDLER



Stored Procedure가 실행되는 도중에 발생하는 에러는 DECLARE ... HANDLER 구문을 사용해서 처리할 수 있습니다.


MS-SQL의 TRY ... CATCH 구문과 비교했을 때 아무런 부족함이 없다는 점... 칭찬해~


기본 문법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE handler_action HANDLER
    FOR condition_value [, condition_value] ...
    statement
 
handler_action:
    CONTINUE
  | EXIT
  | UNDO
 
condition_value:
    mysql_error_code
  | SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
cs


DECLARE ... HANDLER 구문을 사용할 수 있는 위치

SP의 body는 반드시 아래의 순서로 작성해야 합니다.

  1. 모든 지역 변수를 DECLARE 문으로 선언한다.
  2. DECLARE ... HANDLER 구문을 작성한다.
  3. SQL 문을 작성한다.


어떤 상태를 캐치할 수 있나?

  1. 특정 에러
    1. 특정 ERROR CODE 발생
    2. 특정 SQLSTATE 발생
      1. SQLSTATE는 5자리 문자열 임
  2. SQLWARNING
    1. 에러가 아닌 경고가 발생
    2. SQLSTATE는 '01'로 시작 함
  3. NOT FOUND
    1. 커서가 마지막 레코드에 도달하여, 다음 레코드를 Fetch하지 못했을 때
    2. SQLSTATE는 '02'로 시작함
  4. SQLEXCEPTION
    1. 에러가 발생
    2. SQLSTATE가 '00', '01', '02'로 시작하지 않는 나머지 모두

참고 !!!

MySQL 5.7 에러 코드 및 메세지 목록


https://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html


특정 상태를 캐치했을 때 무엇을 할 수 있나?

  1. CONTINUE
    1. DECLARE CONTINUE HANDLER의 BEGIN ~ END 블럭을 실행하고, 이하의 SP 본문을 이어서 계속 실행합니다.
  2. EXIT
    1. DECLARE EXIT HANDLER의 BEGIN ~ END 블럭을 실행하고, SP의 실행을 종료합니다.
  3. UNDO
    1. 문법에는 나오지만 실제로 UNDO 기능을 지원하진 않습니다.