ORACLE/PL/SQL

Pl/SQL 예외처리(Exception) 기본 실습 (미리 정의된 예외, 사용자 정의 예외)

zammanza 2013. 2. 22. 17:41

미리 정의된 예외

CREATE OR REPLACE PROCEDURE PreException_test

--Exception(예외처리) -미리 정의된 예외-

(v_deptno IN emp.empno%TYPE)

IS

    v_emp   emp%ROWTYPE;

    v_err_code  number;     --에러번호가 저장될 변수

    v_err_msg   varchar2(255);  --에러메세지가 저장될 변수

 

BEGIN

    DBMS_OUTPUT.ENABLE;

    SELECT empno, ename, deptno

    INTO v_emp.empno, v_emp.ename, v_emp.deptno

    FROM emp

    WHERE deptno = v_deptno ;

   

    EXCEPTION

        WHEN DUP_VAL_ON_INDEX THEN

            DBMS_OUTPUT.PUT_LINE('데이터가 존재 합니다.');

            DBMS_OUTPUT.PUT_LINE('DUP_VAL_ON_INDEX 에러 발생');

        WHEN TOO_MANY_ROWS THEN

            v_err_code := sqlcode;

            v_err_msg := sqlerrm;

            DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS 에러 발생');

            DBMS_OUTPUT.PUT_LINE('에러번호 : ' || v_err_code);

            DBMS_OUTPUT.PUT_LINE('에러내용 : ' || v_err_msg);

        WHEN NO_DATA_FOUND THEN

            DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND 에러 발생');

        WHEN OTHERS THEN

            DBMS_OUTPUT.PUT_LINE('기타 에러 발생');

END;

 

 

 

 


실행 (입력값 : 20)

 

TOO_MANY_ROWS 에러 발생
에러번호 : -1422
에러내용 : ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다

 

 

 

 

 

 

 

사용자 정의 예외

CREATE OR REPLACE PROCEDURE User_Exception

--Exception(예외처리) -사용자 정의 예외-

(v_deptno IN emp.deptno%type )

IS

    -- 예외의 이름을 선언

    user_define_error EXCEPTION; -- STEP 1

    cnt NUMBER;

   

BEGIN

    DBMS_OUTPUT.ENABLE;

   

    SELECT COUNT(empno)

    INTO cnt

    FROM emp

    WHERE deptno = v_deptno;

   

    IF cnt < 5 THEN

        -- RAISE 문을 사용하여 직접적으로 예외를 발생시킨다

        RAISE user_define_error; -- STEP 2

    END IF;

   

    EXCEPTION

    -- 예외가 발생할 경우 해당 예외를 참조한다.

    WHEN user_define_error THEN -- STEP 3

    RAISE_APPLICATION_ERROR(-20001, '부서에 사원이 몇명 안되네요..');

END;

 

 

 


실행 (입력값 : 10)