MySQL 저장 프로시져 ( Stored Procedure ) 내에서, 쿼리 에러 발생시,
그 에러에 대한 HANDLER 가 정의되어 있지 않으면, 에러 발생 위치에서 Stored Procedure 가 종료됨.
이 때,
1) 에러 처리 구문 실행 후, Stored Procedure 종료 하는 방법
2) 에러 처리 구문 실행 후, 다음 쿼리를 계속 실행 하는 방법
3) DECLARE ... HANDLER 구문 분석
4) DECLARE ... HANDLER 구문 특이사항
- 아 래 -
1) 에러 처리 구문 실행 후, Stored Procedure 종료 하는 방법
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- 여기에 에러 처리 구문 추가!
END;
2) 에러 처리 구문 실행 후, 다음 쿼리를 계속 실행 하는 방법
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
-- 여기에 에러 처리 구문 추가!
END;
3) DECLARE ... HANDLER 구문 분석
구문 : DECLARE [handler_action] HANDLER [condition_value] [statement]
[handler_action]
CONTINUE : 계속 진행
EXIT : 중지, 종료
[condition_value]
mysql_error_code : MySQL 에러 코드 ( number 값 ) [참조: Server Error Codes and Messages]
SQLSTATE [VALUE] :
5 자리의 문자로 정의된, SQL 상태값.
'00' 으로 시작하는 경우 정상.
SQLSTATE 는 ODBC 에서 정의된 상태값이므로, mysql의 에러 코드와 100% 매칭되지는 않음.
[참조: Server Error Codes and Messages]
condition_name : 미리 정의한 조건의 상수값 [참조: DECLARE ... CONDITION Syntax]
예) mysql 에러 코드 1051 발생시의 에러 처리
DECLARE CONTINUE HANDLER FOR 1051
BEGIN
-- body of handler
END;
또는
DECLARE no_such_table CONDITION FOR 1051;
DECLARE CONTINUE HANDLER FOR no_such_table
BEGIN
-- body of handler
END;
SQLWARNING : SQLSTATE 값이 '01' 로 시작하는 경우
NOT FOUND : SQLSTATE 값이 '02' 로 시작하는 경우
SQLEXCEPTION : SQLSTATE 값이 '00', '01', '02' 로 시작하지 않는 경우.
[statement] : 조건 만족시 실행할 구문
4) DECLARE ... HANDLER 구문 특이사항
[statement] 위치에 ITERATE 또는 LEAVE 구문을 사용할 수 없음.
[참조: DECLARE ... HANDLER Syntax]