MySQL에서는 클라이언트나 서버를 이용하는 중 오류가 발생할 시에 이를 직접적으로 처리할 수 있는 방법을 제공한다. 오류가 방대한 점을 고려하여 실습에서 모두 다뤄보는 것은 무리가 있고, 오류코드나 상태코드에 관해 상세한 설명을 보기 위해서는 링크를 통해 확인하면 된다.
/* 기본 형식
DECLARE 액션 HANDLER FOR 오류조건 처리할_문장 ;
액션: 오류 발생 시에 행동을 정의하는데 CONTINUE와 EXIT 둥 중 하나를 사용한다. CONTINUE가 나오면 제일 뒤의 '처리할 문장' 부분이 처리된다.
오류조건: 어떤 오류를 처리할 것인지를 지정한다. 여기에는 MySQL의 오류 코드 숫자가 오거나 SQLSTATE '상태코드', SQLEXCEPTION, SQLWARNING, NOT FOUND 등이 올 수 잇다.
SQLSTATE에서 상태코드는 5자리 문자열로 되어 있다. SQLEXCEPTION은 대부분의 오류를, SQLWARNING은 경고 메시지를, NOT FOUND는 커서나 SELECT...INTO에서 발생되는 오류를 의미한다.
처리할 문장: 처리할 문장이 하나라면 한 문장이 나오면 되며, 처리할 문장이 여러 개일 경우에는 BEGIN...END로 묶어줄 수 있다.
*/
-- 예시: 테이블이 없을 경우에 오류를 직접 처리하는 코드
DROP PROCEDURE IF EXISTS errorProc ;
DELIMITER $$
CREATE PROCEDURE errorProc()
BEGIN
DECLARE CONTINUE HANDLER FOR 1146 SELECT '테이블이 없어요' AS '메세지' ;
SELECT * FROM noTable ; -- noTable은 없음.
END $$
DELIMITER ;
CALL errorProc() ;
-- 예시: 기본 키가 중복되는 경우 오류를 처리하는 방법
DROP PROCEDURE IF EXISTS errorProc2 ;
DELIMITER $$
CREATE PROCEDURE errorProc2()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
SHOW ERRORS ; -- 오류 메세지를 보여 준다.
SELECT '오류가 발생했네요. 작업은 취소시켰습니다.' AS '메시지' ;
ROLLBACK ; -- 오류 발생 시 작업을 롤백시킨다.
END ;
INSERT INTO usertbl VALUES('LSG', '이상구', 1988, '서울', NULL,
NULL, 170, CURRENT_DATE()) ; -- 중복되는 아이디이므로 오류 발생
END $$
DELIMITER ;
CALL errorProc2() ;'IT Self-study > MySQL & Database' 카테고리의 다른 글
| 테이블 생성 및 데이터 입력 (0) | 2025.01.17 |
|---|---|
| 동적 SQL (0) | 2025.01.15 |
| SQL 프로그래밍 (0) | 2025.01.11 |
| JOIN (2) | 2025.01.10 |
| 피벗(Pivot) 구현 (0) | 2025.01.08 |