7.2 미리 정의된 예외(Predefined Exceptions)

출처 http://www.gurubee.net/lecture/1071

오라클 PL/SQL은 자주 일어나는 몇가지 예외를 미리 정의해 놓았으며, 이러한 예외는 개발자가 따로 선언할 필요가 없다.

미리 정의된 예외의 종류

  – NO_DATA_FOUND : SELECT문이 아무런 데이터 행을 반환하지 못할 때

  – DUP_VAL_ON_INDEX : UNIQUE 제약을 갖는 컬럼에 중복되는 데이터가 INSERT 될 때

  – ZERO_DIVIDE : 0으로 나눌 때

  – INVALID_CURSOR : 잘못된 커서 연산

  – Predefined PL/SQL Exceptions 더 보기

미리 정의된 예외 예제

 
SQL> CREATE OR REPLACE PROCEDURE PreException_test
         (v_deptno  IN emp.deptno%TYPE)  
    
   IS

       v_emp   emp%ROWTYPE;

   BEGIN

      DBMS_OUTPUT.ENABLE;

      SELECT empno, ename, deptno
      INTO v_emp.empno, v_emp.ename, v_emp.deptno
      FROM emp
      WHERE deptno = v_deptno ;

      DBMS_OUTPUT.PUT_LINE('사번 : ' || v_emp.empno);
      DBMS_OUTPUT.PUT_LINE('이름 : ' || v_emp.ename);
      DBMS_OUTPUT.PUT_LINE('부서번호 : ' || v_emp.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  

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

      WHEN   NO_DATA_FOUND   THEN  

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

      WHEN OTHERS THEN 

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

  END;
  / 

-- DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용
SQL> SET SERVEROUTPUT ON ;  

-- 프로시저 실행
SQL> EXECUTE PreException_Test(20);
TOO_MANY_ROWS에러 발생

-- TOO_MANY_ROWS 에러가 발생하는 이유?
 - SELECT문의 결과가 1개 이상의 행을 리턴하기 때문이다..
 - TOO_MANY_ROWS를 피하기 위해서는 FOR문이나 LOOP문으로 SELECT문을 처리해야 한다.

--아래와 같이 변경하면 에러가 발생하지 않는다.

  FOR  emp_list  IN
      (SELECT empno, ename, deptno
       FROM emp
       WHERE deptno = v_deptno)   LOOP

      DBMS_OUTPUT.PUT_LINE('사번 : ' || emp_list.empno);
      DBMS_OUTPUT.PUT_LINE('이름 : ' || emp_list.ename);
      DBMS_OUTPUT.PUT_LINE('부서번호 : ' || emp_list.deptno);

  END LOOP;
    

답글 남기기 0

Your email address will not be published. Required fields are marked *