MySQL 저장 과정 중 기본적인 비정상 처리 강좌

1725 단어
때때로, 저장 프로세스가 오류를 던져서 실행을 중지하는 것을 원하지 않고, 오류 코드를 되돌려 주기를 원한다.Mysql은 비정상 처리를 지원합니다. CONTINUE/EXIT 비정상 처리를 정의하는 HANDLER를 통해 SQLWARNING/NOT FOUND/SQLEXCEPTION (경고/데이터 없음/기타 비정상) 을 포착합니다.그 중에서 FOR 뒤에는 SQLWARNING, NOT FOUND, SQLEXCEPTION으로 모든 이상을 처리하도록 지시할 수 있다. 이것은oracle의others에 해당한다.예를 들어 예외 처리를 하지 않으면 다음 코드에서 ERROR 1062(23000) 오류가 발생합니다.

CREATE PROCEDURE test_proc_ins1(
     IN i_id INT,
     IN i_name VARCHAR(100)
)
BEGIN
     INSERT INTO testproc VALUES (i_id,i_name);
     INSERT INTO testproc VALUES (i_id,i_name);
END;

이상 처리 후 던지기 오류를 피하고 되돌아오는 매개 변수 o 를 정의할 수 있습니다ret는 특수한 값을 부여하여 실패를 표시합니다. 예를 들어 자바 코드에서 이상을 포착하는 방식이 아니라 되돌아오는 값을 가져와서 업무 논리를 처리할 수 있습니다.예를 들어 반환 값을 -1:

CREATE PROCEDURE test_proc_ins1(
     IN i_id INT,
     IN i_name VARCHAR(100),
     OUT o_ret INT)
BEGIN
     DECLARE EXIT HANDLER FOR SQLSTATE '23000' set o_ret = -1;
--        :
-- DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set o_ret=-1;
     INSERT INTO testproc VALUES (i_id,i_name);
     INSERT INTO testproc VALUES (i_id,i_name);
     set o_ret = 1;
END;

물론 특정한 SQL 문장에 대해서도 메인 키가 충돌하면 롤백을 지정할 수 있다.

DECLARE exit HANDLER FOR SQLSTATE '23000'

delimiter //

CREATE PROCEDURE TEST()
BEGIN
DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND
begin
rollback;
insert into bb values('error');
end;
START TRANSACTION;
INSERT INTO aa VALUES (1);
INSERT INTO aa VALUES (2);
COMMIT;
END;
//

CALL test()//

좋은 웹페이지 즐겨찾기