Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the ultimate-member domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /ledcorps/www/wp/wp-includes/functions.php on line 6114 7.2 미리 정의된 예외(Predefined Exceptions) – 대나무숲

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 *