|
WHEN OTHERS 구문은 EXCEPTION 처리의 마지막 구문으로서 미리 선언되지 못한 모든 경우의 EXCEPTION처리를 가능하게 합니다. |
|
EXCEPTION Keyword에 의해 Error처리가 시작됩니다. |
|
EXCEPTION 처리구문이 필요하지 않으면 생략할 수 있습니다. |
=========================================================================================
|
Predefined EXCEPTION |
DECLARE Section에서 선언할 필요가 없습니다.
Oracle Server 에러 중에서 자주 발생되는 20가지 에러에 대해 미리 정의되어 있는 EXCEPTION입니다.
해당 EXCEPTION 처리 루틴에서 미리 정의된 EXCEPTION명을 참조하여 에러를 처리합니다.
Predefined EXCEPTION의 종류에는 다음과 같은 것들이 있습니다. |
EXCEPTION명 |
에러번호 |
설 명 |
NO_DATA_FOUND |
ORA-01403 |
데이터를 반환하지 않은 SELECT문 |
TOO_MANY_ROWS |
ORA-01422 |
두 개 이상을 반환한 SELECT문 |
INVALID_CURSOR |
ORA-01001 |
잘못된 CURSOR 연산 발생 |
ZERO_DIVIDE |
ORA-01476 |
0으로 나누기 |
DUP_VAL_ON_INDEX |
ORA-00001 |
UNIQUE COLUMN에 중복된 값을
입력할 때 |
CURSOR_ALREADY_OPEN |
ORA-06511 |
이미 열러 있는 커서를 여는 경우 |
INVALID_NUMBER |
ORA-01722 |
문자열을 숫자로 전환하지 못한 경우 |
LOGIN_DENIED |
ORA-01017 |
유효하지 않은 사용자로 LOGON 시도 |
NOT_LOGGED_ON |
ORA-01012 |
PL/SQL 프로그램이 오라클에 연결되지
않은 상태서 호출 |
PROGRAM_ERROR |
ORA-06501 |
PL/SQL 내부에 오류 |
STORAGE_ERROR |
ORA-06500 |
PL/SQL에 메모리 부족 |
TIMEOUT_ON_RESOURCE |
ORA-00051 |
오라클이 자원을 기다리는 동안 시간
초과 발생 |
VALUE_ERROR |
ORA-06502 |
산술, 절단 등에서 크기가 다른 오류 발생 | |
======================================================================================
CREATE OR REPLACE PROCEDURE show_emp
(v_salary IN s_emp.salary%type )
IS
v_name s_emp.name%TYPE;
v_sal s_emp.salary%TYPE;
v_title s_emp.title%TYPE;
BEGIN
SELECT name, salary, title
INTO v_name, v_sal , v_title
FROM s_emp
WHERE salary = v_salary ;
DBMS_OUTPUT.PUT_LINE(' 이 름 '||' 급 여 '||' 직 책 ' );
DBMS_OUTPUT.PUT_LINE('--------------------------------' );
DBMS_OUTPUT.PUT_LINE(v_name ||v_sal ||v_title);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('ERROR!!!-해당급여를 받는 사원은
없습니다.');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('ERROR!!!-해당급여를 받는 사원이
너무 많습니다.');
END;
/ | |
|
|
|
| |
|
|
|
|
|
SQL>EXECUTE show_emp (2400)
ERROR!!!-해당급여를 받는 사원이 너무 많습니다.
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL>EXECUTE show_emp (500)
ERROR!!!-해당급여를 받는 사원은 없습니다.
PL/SQL 처리가 정상적으로 완료되었습니다. | | |
|
|
Non-Predefined EXCEPTION |
Oracle Server Error중 미리 정의되지 않은 Error는 사용자가 DECLARE Section에서 EXCEPTION명을 정의하고 Oracle Server에서 제공하는 Error번호를 사용하여 Error와
연결한 후 EXCEPTION Section에서 Error처리 Routine을 기술합니다. |
|
DECLARE
exception명 EXCEPTION;
PRAGMA EXCEPTION_INIT(exception명, 에러번호);
BEGIN
. . .
EXCEPTION
WHEN exception명 THEN
. . .
END; | | |
|
|
S_PRODUCT 테이블에서 제품번호를 입력받아 제품을 삭제하는 프로그램을
작성하면 다음과 같습니다.
Oracle Server 에러번호 -2292인 무결성 제약조건 위반 에러처리를 합니다. |
|
|
|
|
CREATE OR REPLACE PROCEDURE del_product
( v_id IN s_product.id%TYPE )
IS
fk_error EXCEPTION;
PRAGMA EXCEPTION_INIT(fk_error , -2292);
BEGIN
DELETE FROM s_product
WHERE id = v_id;
COMMIT;
EXCEPTION
WHEN fk_error THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('참조되는 CHILD RECORD가 있으므로 삭제할
수 없습니다.');
END;
/ | |
|
|
|
| |
|
|
|
|
|
SQL>EXECUTE del_product(50530)
참조되는 CHILD RECORD가 있으므로 삭제할 수 없습니다.
PL/SQL 처리가 정상적으로 완료되었습니다. | | |
|
|
User Defined EXCEPTION |
사용자 정의 EXCEPTION은 Oracle Server Error는 아니고, 사용자가 정한 조건이 만족되지 않을 때, Error를 발생시키는 방법입니다.
DECLARE Section에서 EXCEPTION명을 정의하고
BEGIN Section에서 RAISE문을 써서 에러를 발생시킵니다. 그리고 EXCEPTION Section에서 에러 처리문을 기술합니다. |
|
DECLARE
exception명 EXCEPTION;
BEGIN
RAISE exception명;
. . .
EXCEPTION
WHEN exception명 THEN
. . .
END; | | |
|
|
S_EMP 테이블에 새로운 사원을 입력하는 프로그램을 작성하면
다음과 같습니다.단, 사번은 일련번호로 부여할 수 있도록 값을 지정하고
이름, 직책, 급여, 커미션은 사용자가 입력합니다.
단, 급여를 600이하로 입력시에는 입력이 불가능하도록 처리합니다. |
|
|
|
|
CREATE OR REPLACE PROCEDURE in_emp
(v_name IN s_emp.name%TYPE ,
v_sal IN s_emp.salary%TYPE ,
v_title IN s_emp.title%TYPE ,
v_comm IN s_emp.commission_pct%TYPE )
IS
v_id s_emp.id%TYPE ;
lowsal_err EXCEPTION ;
BEGIN
SELECT MAX(id)+1
INTO v_id
FROM s_emp ;
IF v_sal >= 600 THEN
INSERT INTO s_emp
(id,name,salary,title,commission_pct,start_date)
VALUES(v_id,v_name, v_sal,v_title,v_comm,SYSDATE) ;
ELSE
RAISE lowsal_err ;
END IF ;
EXCEPTION
WHEN lowsal_err THEN
DBMS_OUTPUT.PUT_LINE ('ERROR!!!-지정한 급여가 너무 적습니다.
600이상으로 다시 입력하세요.') ;
END;
/ | |
|
|
|
| |
|
|
|
|
|
SQL>EXECUTE in_emp('김흥국',500,'과장',12.5)
ERROR!!!-지정한 급여가 너무 적습니다.600이상으로 다시 입력하세요.
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL>EXECUTE in_emp('김흥국',900,'과장',12.5)
PL/SQL 처리가 정상적으로 완료되었습니다 | | | |