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

MySQL 저장 프로시저에서 오류 메시지를 출력하고 실행을 종료하는 핸들러 작성 방법

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 구문을 사용하면 보다 구체적인 오류 코드와 메시지를 반환하는 것도 가능합니다.