MySQL 저장 프로시저에서 예외가 발생했을 때 적절한 오류 메시지를 던져 이를 처리하는 것은 매우 중요합니다. 만약 예외를 처리하지 않으면, 저장 프로시저 내부에서 발생한 특정 예외 때문에 애플리케이션 전체가 실패할 위험이 있습니다.
MySQL은 기본 MySQL 오류에 대해 SQLSTATE를 활용하는 핸들러(handler)를 제공하며, 이 핸들러는 오류 발생 시 실행을 즉시 종료(exit)합니다.
예제: 중복 기본 키 삽입 시나리오
아래 예제에서는 Primary Key 컬럼에 중복된 값을 삽입하려고 시도하는 상황을 통해 EXIT HANDLER의 동작을 살펴보겠습니다.
mysql> Delimiter //
mysql> Create Procedure Insert_Studentdetails4(S_Studentid INT, S_StudentName Varchar(20), S_Address Varchar(20),OUT got_error INT)
-> BEGIN
-> DECLARE EXIT HANDLER FOR 1062 SET got_error=1;
-> INSERT INTO Student_detail
-> (Studentid, StudentName, Address)
-> Values(S_Studentid,S_StudentName,S_Address);
-> Select * from Student_detail;
-> END //
Query OK, 0 rows affected (0.00 sec)
핸들러의 동작 원리
위 프로시저에서 핵심은 다음 구문입니다.
DECLARE EXIT HANDLER FOR 1062 SET got_error=1;
이 구문은 MySQL 오류 코드 1062(중복 키 입력 오류)가 발생하면 변수 got_error를 1로 설정하고 프로시저의 실행을 즉시 종료하도록 선언합니다.
이제 'studentid' 컬럼에 중복된 값을 추가하려고 시도하면 어떻게 되는지 확인해 보겠습니다.
mysql> Delimiter ;
mysql> CALL Insert_Studentdetails4(104,'Ram','Chandigarh',@got_error);
Query OK, 0 rows affected (0.00 sec)
mysql> Select @got_error;
+------------+
| @got_error |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
실행 결과 분석
호출 결과에서 알 수 있듯이, 중복 값 삽입 시도 시 다음과 같은 동작이 일어납니다.
1. 실행 즉시 종료: 프로시저 내부에 작성된 Select * from student_detail 쿼리의 결과 집합은 반환되지 않습니다. EXIT HANDLER가 선언된 위치 이후의 문장은 실행되지 않기 때문입니다.
2. 기본 오류 메시지 반환: MySQL은 중복 값 입력과 관련된 기본 오류 메시지인 1062번 오류를 그대로 출력합니다.
3. 변수 값 설정: got_error 변수가 1로 설정되어, 호출자 측에서 오류 발생 여부를 확인할 수 있습니다.
이처럼 SQLSTATE와 EXIT HANDLER를 활용하면 저장 프로시저에서 오류 발생 시 안전하게 실행을 종료하고, 애플리케이션 레벨에서 오류 상태를 감지할 수 있도록 처리할 수 있습니다.