Predefined Exception[미리정의된 예외]

◈ 오라클 PL/SQL은 자주 일어나는 몇가지 예외를 미리 정의해 놓았으며, 이러한 예외는 개발자가 따로 선언할 필요가 없습니다 ▣ 미리 정의된 예외의 종류?◈ NO_DATA_FOUND : SELECT문이 아무런 데이터 행을 반환하지 못할때 ◈ TOO_MANY_ROWS : 하나만 리턴해야하는 SELECT문이 하나 이상의 행을 반환할 때 ◈ INVALID_CURSOR : 잘못된 커서 연산 ◈ ZERO_DIVIDE : 0으로 나눌때 ◈ DUP_VAL_ON_INDEX : UNIQUE 제약을 갖는 컬럼에 중복되는 데이터가 INSERT될때 이 외에도 몇 개가 더 있습니다.
미리 정의된 예외 예제SQL> CREATE OR REPLACE PROCEDURE PreException_test (v_deptno IN emp.empno%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; / 프로시저가 생성되었습니다.프로시저 실행SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)SQL> EXECUTE PreException_Test(20);TOO_MANY_ROWS에러 발생PL/SQL 처리가 정상적으로 완료되었습니다.※ 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;