반응형

예외처리

: 예측가능한 에러 상황을 시스템이 정상 종료되도록 처리하는 것
구체적인 예외명을 알 수 없을 때 : 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번
/

 

반응형

'[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

+ Recent posts