Database

[MySQL] Stored Procedure - HANDLER

비번변경 2025. 4. 1. 17:11

개요

2025.03.06-[MySQL] Stored Procedure - 매개변수에 이어서 이번 글도 프로시저와 관련된 부분이다.

Stored Procedure를 다루다보면 자연스럽게 에러 처리에 대한 요구사항도 생기기 마련이다. 이번 글에서는 Stored Procedure에서 에러를 적절하게 처리하기 위한 개념인 Handler에 대해서 알아본다.

 

 

Handler

프로시저 내에서 DECLARE ~ HANDLER 구문은 하나 이상의 조건을 처리하는 핸들러를 정의할 수 있다. 

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
}

condition_value을 만족하면 statement에 해당하는 구문이 실행되는데, 구문은 변수를 할당하는 간단한 문장이 될 수도 있고 아예 BEGIN ~ END로 끝나는 블럭이 될 수도 있다. 또한 핸들러는 프로시저 내에서 변수가 정의된 이후에 정의되어야 한다. 

핸들러 정의 시에는 조건을 만족하면 취할 handler_action도 지정할 수 있는데, 여기서 handler_action이란 statement를 실행하고 프로그램을 계속 실행(CONTINUE)하느냐, 프로그램을 종료(EXIT)하느냐에 해당한다.

또한 condition_value는 사전에 DECLARE ~ CONDITION으로 정의한 조건, 에러코드, SQLSTATE 값 클래스나 그 약어 등이 올 수 있다.

 

 

예시

위에서 살펴본 내용을 예시와 함께 알아보자. 아래 프로시저는 test라는 테이블에서 데이터를 조회하는 간단한 프로시저이다.

CREATE PROCEDURE test_procedure(
)
BEGIN
    SELECT *
    FROM test;
END

하지만 test 테이블이 없는 상태에서 호출해보면 아래와 같은 오류 메세지를 확인할 수 있다.

 

이제 테이블이 없다는 오류를 만나면 NO TABLE이라는 메세지를 출력하고 종료하게끔 변경하고 싶다. 

CREATE PROCEDURE test_procedure(
)
BEGIN
    DECLARE EXIT HANDLER FOR 1146 SELECT "NO TABLE";
    
    SELECT *
    FROM test;
END

-- 호출
CALL test_procedure();

프로시저 내에서 사용할 변수가 없으므로 BEGIN ~ END 블럭 내 첫부분에 핸들러를 정의한다. 이 글에서는 테이블이 없다는 오류만 처리하고자 condition_value에 mysql 에러코드인 1146을 지정했다. 만약 SQLSTATE 값으로 지정하고 싶다면 다음과 같이 선언하면 된다.

DECLARE EXIT HANDLER FOR SQLSTATE "42S02" SELECT "NO TABLE";

 

이제 다시 프로시저를 호출해보면 의도한 대로  NO TABLE이라는 문자열을 출력하고 끝나는 것을 확인할 수 있다.

 

 

참고 문서

https://dev.mysql.com/doc/refman/8.4/en/declare-handler.html

https://purumae.tistory.com/199

https://blog.duveen.me/23

728x90