오라클 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;
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
- - 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- - 구루비의 모든 강좌는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
'IT > 오라클' 카테고리의 다른 글
Oracle PL/SQL 강좌 7.4. 사용자 정의 예외(User-Defined Exceptions) (0) | 2015.11.24 |
---|---|
Oracle PL/SQL 강좌 7.3. 미리 정의되지 않은 예외(Non-Predefined Exception) (0) | 2015.11.24 |
Oracle PL/SQL 강좌 7.1. 예외(Exception) (0) | 2015.11.24 |
Oracle PL/SQL 강좌 6.2.5. The WHERE CURRENT OF Clause (0) | 2015.11.24 |
Oracle PL/SQL 강좌 6.2.4. 파라미터가 있는 커서(Cursors with Parameters) (0) | 2015.11.24 |