반응형

EXCEPTION
    WHEN exception명1 [OR exception명2...] THEN
        문장1;
        문장2; ...
    [WHEN exception명3 [OR exception명4...] THEN
        문장1;
        문장2; ...]
    [WHEN OTHERS THEN
        문장1;
        문장2; ...]

 

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 처리가 정상적으로 완료되었습니다

 

일반적인 Error처리를 위하여 Oracle에서 제공하는 함수인 SQLCODE, SQLERRM을
활용할 수 있습니다.

SQLCODE : Oracle에서 지정된 Error Code를 숫자로 Return

SQLERRM :

Oracle에서 지정된 Error Code에 해당하는 Error Message를
Return

 

SQLCODE, SQLERRM 함수를 활용하는 것 외에도 WHEN OTHERS절을 사용하여 Error를
처리할 수 있습니다. WHEN OTHERS절은 예상치 못한 Error처리를 위해서 미리 선언되지
않은 모든 종류의 Error를 처리합니다.

이번에는 SQLCODE와 SQLERRM에 대해서 예를 통해 살펴봅니다.



User Defined EXCEPTION의 예제9에서 작성한 Procedure를 이용하여 데이터를
입력하되 단, 커미션을 30%로 지정하여 실행하시오.

 

BEGIN in_emp('이한이',1200,'사원',30); END;

*
1행에 오류:
ORA-02290: 체크 제약조건(SCOTT.S_EMP_COMMISSION_PCT_CK)이
위배되었습니다
ORA-06512: "SCOTT.IN_EMP", 줄 14에서
ORA-06512: 줄 1에서  

 

 

SQL>SELECT constraint_name, constraint_type, search_condition
    2  FROM user_constraints
    3  WHERE table_name = 'S_EMP' ;


 

 


 

예제 9에서 실행시에 해당 COMMISSION_PCT를 입력하지 않는 경우에도
프로그램이 정상적으로 수행되도록 User Defined EXCEPTION의 예제9에서
작성한 프로그램을 보완하면 다음과 같습니다.

 

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 ;
v_code         NUMBER ;
v_message    VARCHAR2(100) ;
 
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이상으로 다시 입력하세요.') ;
WHEN OTHERS THEN
   v_code := SQLCODE ;
   v_message := SQLERRM ;
DBMS_OUTPUT.PUT_LINE('에러코드   =>'||v_code) ;
DBMS_OUTPUT.PUT_LINE('에러메세지=>'||v_message) ;

END;
/

 

 

SQL>EXECUTE in_emp('이한이',1200,'사원',30)
에러코드   =>-2290
에러메세지=>ORA-02290: 체크 제약조건
(SCOTT.S_EMP_COMMISSION_PCT_CK)이 위배되었습니다

PL/SQL 처리가 정상적으로 완료되었습니다.

반응형

'Database > ORACLE' 카테고리의 다른 글

System Account Lock (System 계정 락 걸림)  (0) 2010.07.15
오라클 클론 디비로 복구 하기  (0) 2010.07.13
RMAN 사용법  (0) 2010.07.06
오라클 암호화 기능  (0) 2010.07.02
오라클 pump 관련 자료  (0) 2010.06.30

+ Recent posts