MySQL 저장 프로시저에서 예외(exception)가 발생하면 이를 적절한 오류 메시지로 처리하는 것이 매우 중요합니다. 만약 예외를 처리하지 않으면 해당 예외로 인해 애플리케이션 전체가 실패할 가능성이 있기 때문입니다. 다행히 MySQL은 예외 발생 시 특정 변수에 값을 설정하고 실행을 계속 진행하는 핸들러(handler)를 제공합니다.
CONTINUE HANDLER를 활용한 예제
아래 예제는 Primary Key 컬럼에 중복된 값을 삽입하려는 상황에서 CONTINUE HANDLER가 어떻게 동작하는지 보여줍니다. 프로시저는 OUT 파라미터인 got_error를 통해 오류 발생 여부를 호출자에게 전달합니다.
mysql> DELIMITER //
mysql> Create Procedure Insert_Studentdetails2(S_Studentid INT, S_StudentName Varchar(20), S_Address Varchar(20),OUT got_error INT)
-> BEGIN
-> DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 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)
mysql> Delimiter ;
핵심은 다음 한 줄입니다:
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET got_error=1;
이 구문은 SQL 예외가 발생했을 때 프로시저 실행을 중단하지 않고 계속 진행하며, 그와 동시에 got_error 변수의 값을 1로 설정하도록 지정합니다. 즉, 오류가 나더라도 프로시저 내부의 나머지 문장들이 정상적으로 실행됩니다.
정상적인 데이터 삽입 테스트
먼저 중복되지 않는 학번으로 데이터를 삽입해 보겠습니다.
mysql> CALL Insert_Studentdetails2(104,'Ram','Chandigarh',@got_error);
+-----------+-------------+------------+
| Studentid | StudentName | address |
+-----------+-------------+------------+
| 100 | Gaurav | Delhi |
| 101 | Raman | Shimla |
| 103 | Rahul | Jaipur |
| 104 | Ram | Chandigarh |
+-----------+-------------+------------+
4 rows in set (0.04 sec)
Query OK, 0 rows affected (0.06 sec)
중복 값 삽입 시 동작 확인
이번에는 이미 존재하는 학번 '104'로 중복 데이터를 삽입해 봅니다. Primary Key 제약 조건 위반으로 예외가 발생하지만, CONTINUE HANDLER 덕분에 실행이 중단되지 않고 프로시저 안의 SELECT * FROM student_detail 결과 집합까지 정상적으로 반환됩니다.
mysql> CALL Insert_Studentdetails2(104,'Shyam','Hisar',@got_error);
+-----------+-------------+------------+
| Studentid | StudentName | address |
+-----------+-------------+------------+
| 100 | Gaurav | Delhi |
| 101 | Raman | Shimla |
| 103 | Rahul | Jaipur |
| 104 | Ram | Chandigarh |
+-----------+-------------+------------+
4 rows in set (0.00 sec)
Query OK, 0 rows affected (0.03 sec)
그리고 @got_error 변수의 값을 확인해 보면 예외가 발생했음을 알 수 있습니다.
mysql> Select @got_error;
+------------+
| @got_error |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
정리
이처럼 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 구문을 사용하면 저장 프로시저에서 예외가 발생해도 실행이 중단되지 않고, 오류 발생 사실을 변수에 기록한 뒤 남은 로직을 끝까지 수행할 수 있습니다. 애플리케이션 입장에서는 got_error 값이 1인지만 확인하면 오류 여부를 판단할 수 있으므로, 예외 상황에서도 안정적으로 동작하는 견고한 프로시저를 작성할 수 있습니다.