[MySQL] Procedure 예외처리, 경고 처리.
DECLARE EXIT HANDLER FOR SQLEXCEPTION : 예외 처리.
DECLARE EXIT HANDLER FOR SQLWARNING : 경고 처리.
DELIMITER $$
CREATE PROCEDURE sp_procedure_ex( IN vDoc VARCHAR(13), IN vSequenceID VARCHAR(256) )
BEGIN
DECLARE iResult INT DEFAULT(0);
DECLARE iSQLDoc VARCHAR(13);
-- 쿼리 예외처리 오류 시 해당 처리
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
-- 오류 상태, 오류 메시지.
SELECT @p1 AS RETURNED_SQLSTATE, @p2 as MESSAGE_TEXT;
ROLLBACK; -- TRANSACTION 종료 되지 않는 부분 종료 처리 (Unlock)
END;
-- 쿼리 경고 생기면 해당 처리
DECLARE EXIT HANDLER FOR SQLWARNING
BEGIN
GET DIAGNOSTICS CONDITION 1
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
-- 경고 상태, 경고 메시지.
SELECT @p1 AS RETURNED_SQLSTATE, @p2 as MESSAGE_TEXT;
ROLLBACK; -- TRANSACTION 종료 되지 않는 부분 종료 처리 (Unlock)
END;
PROC_RETURN : BEGIN -- BLOCK NAME 설정 (RETURN 유사 기능 처리. LEAVE -> BREAK 비슷)
IF NOT CHAR_LENGTH(vDoc) = 13 THEN -- iDoc의 길이가 13 이지 않으면 반환
SET iResult = 99999;
LEAVE PROC_RETURN;
END IF;
SELECT doc INTO iSQLDoc FROM docTBL WHERE doc = vDoc;
SET @SQL_Query = CONCAT('INSERT INTO sequenceTBL VALUES(1, "', iSQLDoc, '", "', vDoc, '") ');
PREPARE curQuery FROM @SQL_Query;
EXECUTE curQuery;
DEALLOCATE PREPARE curQuery;
-- TRANSACTION = lock (작업단위 락) / COMMIT or ROLLBACK = Unlock (작업단위 락 해제)
START TRANSACTION;
INSERT INTO sequenceTBL VALUES(2, "', iSQLDoc, '", "', vDoc, '") ');
INSERT INTO sequenceTBL VALUES(2, "', iSQLDoc, '", "', vDoc, '") '); -- 중복 오류(예외처리) 발생 시.
-- 예외 처리 발생 되면 DECLARE EXIT HANDLER FOR SQLEXCEPTION 실행.
-- 예외 처리 발생 되면 DECLARE EXIT HANDLER FOR SQLWARNING 실행.
-- 현재 부분 오류 시 COMMIT 나 ROLLBACK 종료 되지 않아 TRANSACTION 진행 상태로 다른 쿼리 대기 발생.
COMMIT;
END PROC_RETURN; -- BLOCK NAME 설정 해제. LEAVE PROC_BODY; 이면 여기 이후로 실행.
IF 0 <> iResult THEN
SELECT iResult;
ELSE
SELECT 0;
END IF;
END$$