Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 저장 프로시저에서 예외 발생 시 변수에 값 설정 후 실행을 계속하는 CONTINUE HANDLER 작성법

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인지만 확인하면 오류 여부를 판단할 수 있으므로, 예외 상황에서도 안정적으로 동작하는 견고한 프로시저를 작성할 수 있습니다.