728x90
반응형
예외처리 |
|
: 예측가능한 에러 상황을 시스템이 정상 종료되도록 처리하는 것 | |
구체적인 예외명을 알 수 없을 때 : OTHERS를 사용한다. (자바의 EXCETPTION클래스와 유사) OTHER는 오라클 시스템에서 PL/SQL코드 상에서 발생한 런타임 예외를 자동으로 잡아 준다. --오라클에서 제공하는 빌트인 함수(언어 설계 과정에서 미리 만들어진 함수) |
|
SQLCODE : 실행부에서 발생한 예외에 해당하는 코드를 반환 ex) BY ZERO에러 : '-1476'을 반환, 에러가 없으면 0을 반환 |
|
SQLERRM : 발생한 예외에 대한 오류 메시지를 반환 - 매개변수로 예외코드 값을 받는데, 매개변수를 넘기지 않으면 디폴트로 SQLCODE가 반환한 예외코드 값과 연관된 예외 메시지를 반환한다. |
|
DBMS_UTILITY : 좀 더 세부적인 예외 정보제공 ex) DMBS_UTILTY, FORMAT_ERROR_BACKTRACE함수 : 몇 번째 줄에서 예외가 발생했는지 알려줌 SYNTAX : CASE문과 유사 EXCEPTION WHEN 예외명1 THEN 예외처리 구문1 WHEN 예외명2 THEN 예외처리 구문2 .... WHEN OHTERS THEN 예외처리 구문n ; --OTHERS는 가장 마지막에 기술되어야 한다. |
미리 정의된 예외 종류들 | |
ACCESS_INTO_NULL | : (ORA-06530) 객체가 초기화 하지 않은 상태에서 사용시 |
CASE_NOT_FOUND | : (ORA-06592) CASE문 사용시 구문 오류 |
CURSOR_ALREADY_OPEN | : (ORA-06511) 커서가 OPEN상태에서 재OPEN시도시 |
INVALID_CURSOR | : (ORA-01001) 존재하지 않는 커서를 참조 |
INVALID_NUMBER | : (ORA-01722) 문자를 숫자로 변환할 때 실패할 경우 |
NO_DATA_FOUND | : (ORA-01403) SELECT INTO시 데이터가 한 건도 없을 경우 |
TOO_MANY_ROWS | : (ORA-01422) SELECT INTO절 시 결과가 2개 이상일 때 |
VALUE_ERROR | : (ORA-06502) 수치 또는 값 오류 |
ZERO_DIVIDE | : (ORA-01476) 젯수가 0일때 오류 |
에러
DECLARE vi_num NUMBER := 0; BEGIN DBMS_OUTPUT.PUT_LINE('시작!'); vi_num := 10 / 0; DBMS_OUTPUT.PUT_LINE('Success!'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('에러발생'|| SQLERRM); DBMS_OUTPUT.PUT_LINE('정상종료!'); END; /
ㅇㅇ
DECLARE vi_num NUMBER := 0; -- 1 BEGIN DBMS_OUTPUT.PUT_LINE('시작!'); vi_num := 10 / 0; DBMS_OUTPUT.PUT_LINE('Success!'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('오류가 발생했습니다'); BEGIN SELECT MOD (5,2) INTO VI_NUM FROM DUAL; DBMS_OUTPUT.PUT_LINE('VI_NUM: '||VI_NUM); END; END; /
ㄴㄴ
CREATE OR REPLACE PROCEDURE exception_proc IS vi_num NUMBER := 0; BEGIN vi_num := 10 / 0; DBMS_OUTPUT.PUT_LINE('Success!'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('오류가 발생했습니다'); DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE :'||SQLCODE); --매개변수가 없는 SQLERRM DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE : '||SQLERRM); --매개변수가 있는 SQLERRM DBMS_OUTPUT.PUT_LINE('SQLERRM(SQLCODE) : '||SQLERRM(SQLCODE)); DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); END; /
EXEC exception_proc;
ㅁCREATE OR REPLACE PROCEDURE exception_proc IS vi_num NUMBER := 0; V_EMPNO EMP.EMPNO%TYPE; V_ENAME EMP.ENAME%TYPE; BEGIN SELECT EMPNO,ENAME INTO V_EMPNO, V_ENAME FROM EMP WHERE DEPTNO=10; DBMS_OUTPUT.PUT_LINE('Success!'); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND 오류가 발생했습니다'); DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE :'||SQLCODE); DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE : '||SQLERRM); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS 오류가 발생했습니다'); DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE :'||SQLCODE); DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE : '||SQLERRM); END; /
CREATE OR REPLACE PROCEDURE exception_proc IS vi_num NUMBER := 0; V_EMPNO EMP.EMPNO%TYPE; V_ENAME EMP.ENAME%TYPE; BEGIN SELECT EMPNO,ENAME INTO V_EMPNO, V_ENAME FROM EMP WHERE 1=0; DBMS_OUTPUT.PUT_LINE('Success!'); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND 오류가 발생했습니다'); DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE :'||SQLCODE); DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE : '||SQLERRM); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS 오류가 발생했습니다'); DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE :'||SQLCODE); DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE : '||SQLERRM); END; /
--EXCEPTION 중복사용시 BEGIN~END절을 다시 기술해준다.
CREATE OR REPLACE PROCEDURE exception_proc IS vi_num NUMBER := 0; V_EMPNO EMP.EMPNO%TYPE; V_ENAME EMP.ENAME%TYPE; BEGIN --1번 --EXCEPTION 중복사용시 BEGIN~END절을 다시 기술해준다. BEGIN --2번 SELECT EMPNO,ENAME INTO V_EMPNO, V_ENAME FROM EMP WHERE 1=0; DBMS_OUTPUT.PUT_LINE('Success!'); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND 오류가 발생했습니다'); DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE :'||SQLCODE); DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE : '||SQLERRM); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS 오류가 발생했습니다'); DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE :'||SQLCODE); DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE : '||SQLERRM); DBMS_OUTPUT.PUT_LINE('예외처리 후 구문 시작'); vi_num := 10/0; DBMS_OUTPUT.PUT_LINE('BY ZERO에러 발생 후'); END; --2번 EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('BY ZERO에러 발생'); DBMS_OUTPUT.PUT_LINE('시스템 정상종료'); END; --1번 /
728x90
반응형
'[ORACLE]' 카테고리의 다른 글
[ORACLE] TRIGGER (0) | 2024.01.29 |
---|---|
[ORACLE] PROCEDURE --테이블 백업용 프로시저 (0) | 2024.01.29 |
[ORACLE] RETURN (0) | 2024.01.29 |
[ORACLE] PROCEDURE (0) | 2024.01.26 |
[ORACLE] OBJECT, TABLE (0) | 2024.01.26 |