MySQL 저장 프로시저에서 예외가 발생했을 때는 적절한 오류 메시지를 던져 이를 처리하는 것이 매우 중요합니다. 예외를 처리하지 않으면 해당 예외가 그대로 애플리케이션까지 전달되어 프로그램 전체가 비정상적으로 종료될 수 있기 때문입니다.
MySQL은 이런 상황을 위해 EXIT HANDLER를 제공합니다. 이 핸들러를 사용하면 오류 메시지를 출력하고 프로시저의 실행을 즉시 종료할 수 있습니다. 아래 예제는 기본 키(Primary Key) 컬럼에 중복된 값을 삽입하려는 상황을 통해 핸들러의 동작을 보여줍니다.
예제
mysql> Delimiter //
mysql> Create Procedure Insert_Studentdetails3(S_Studentid INT, S_StudentName Varchar(20), S_Address Varchar(20))
-> BEGIN
-> DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT 'Got an error';
-> 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)
mysql> Delimiter ;
mysql> CALL Insert_Studentdetails3(105, 'Mohan', 'Chandigarh');
+-----------+-------------+------------+
| Studentid | StudentName | address |
+-----------+-------------+------------+
| 100 | Gaurav | Delhi |
| 101 | Raman | Shimla |
| 103 | Rahul | Jaipur |
| 104 | Ram | Chandigarh |
| 105 | Mohan | Chandigarh |
+-----------+-------------+------------+
5 rows in set (0.04 sec)
Query OK, 0 rows affected (0.06 sec)
위 코드의 핵심은 다음 구문입니다.
DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT 'Got an error';
이 구문은 프로시저 실행 중 SQLEXCEPTION(SQL 예외)이 발생하면 'Got an error'라는 메시지를 출력하고 프로시저를 즉시 종료하도록 지정합니다. 첫 번째 호출에서는 학번 105가 기존 데이터와 중복되지 않았기 때문에 INSERT가 정상적으로 수행되고, 프로시저 마지막의 SELECT 쿼리 결과인 전체 학생 목록이 함께 반환됩니다.
중복 값 삽입 시 동작 확인
이제 같은 학번 '105'를 가진 데이터를 다시 삽입해 보겠습니다. 기본 키 제약 조건 위반으로 예외가 발생하면, 프로시저는 더 이상 진행되지 않고 즉시 종료됩니다. 따라서 프로시저 안에 작성된 'select * from student_detail' 쿼리의 결과 집합은 반환되지 않으며, 핸들러가 정의한 오류 메시지만 출력됩니다.
mysql> CALL Insert_Studentdetails3(105, 'Sohan', 'Bhopal');
+--------------+
| Got an error |
+--------------+
| Got an error |
+--------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
정리
이처럼 DECLARE EXIT HANDLER FOR SQLEXCEPTION 구문을 활용하면 저장 프로시저에서 오류가 발생했을 때 원하는 메시지를 사용자에게 전달하고, 남은 로직의 실행을 안전하게 중단시킬 수 있습니다. 필요에 따라 SELECT 대신 RESIGNAL이나 SIGNAL SQLSTATE 구문을 사용하면 보다 구체적인 오류 코드와 메시지를 반환하는 것도 가능합니다.