오라클 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;