by 구루비 미리 정의된 예외 NO_DATA_FOUND TOO_MANY_ROWS INVALID_CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEX EXCEPTION [2002.01.20]
오라클 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;
- 강좌 URL : http://www.gurubee.net/lecture/1071
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.