Pl/SQL 예외처리(Exception) 기본 실습 (미리 정의된 예외, 사용자 정의 예외)
미리 정의된 예외
CREATE OR REPLACE PROCEDURE PreException_test
--Exception(예외처리) -미리 정의된 예외-
(v_deptno IN emp.empno%TYPE)
IS
v_emp emp%ROWTYPE;
v_err_code number; --에러번호가 저장될 변수
v_err_msg varchar2(255); --에러메세지가 저장될 변수
BEGIN
DBMS_OUTPUT.ENABLE;
SELECT empno, ename, deptno
INTO v_emp.empno, v_emp.ename, v_emp.deptno
FROM emp
WHERE deptno = v_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
v_err_code := sqlcode;
v_err_msg := sqlerrm;
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS 에러 발생');
DBMS_OUTPUT.PUT_LINE('에러번호 : ' || v_err_code);
DBMS_OUTPUT.PUT_LINE('에러내용 : ' || v_err_msg);
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND 에러 발생');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('기타 에러 발생');
END;
실행 (입력값 : 20)
TOO_MANY_ROWS 에러 발생
에러번호 : -1422
에러내용 : ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다
사용자 정의 예외
CREATE OR REPLACE PROCEDURE User_Exception
--Exception(예외처리) -사용자 정의 예외-
(v_deptno IN emp.deptno%type )
IS
-- 예외의 이름을 선언
user_define_error EXCEPTION; -- STEP 1
cnt NUMBER;
BEGIN
DBMS_OUTPUT.ENABLE;
SELECT COUNT(empno)
INTO cnt
FROM emp
WHERE deptno = v_deptno;
IF cnt < 5 THEN
-- RAISE 문을 사용하여 직접적으로 예외를 발생시킨다
RAISE user_define_error; -- STEP 2
END IF;
EXCEPTION
-- 예외가 발생할 경우 해당 예외를 참조한다.
WHEN user_define_error THEN -- STEP 3
RAISE_APPLICATION_ERROR(-20001, '부서에 사원이 몇명 안되네요..');
END;
실행 (입력값 : 10)