구체적인 예외명을 알 수 없을 때 : 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번
/