C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle/기본]23. 예외 처리 본문

Programming/Oracle 공부

[Oracle/기본]23. 예외 처리

19760323 2017. 5. 31. 16:14

● 예외를 일으키는 두 가지 방법

 

1. 오라클 에러가 발생하면 관련 예외는 자동적으로 일어난다. 예를 들면, 질의 문장의 데이터베이스에서 읽어 들인 행이 아무것도 없을 때,

   ORA-01403가 발생하면, 이 때 PL/SQL은 예외 NO_DATA_FOUND를 일으킨다.

2. 블록 내에서 RAISE 문장을 써서 명시적으로 예외를 일으킨다. 예외는 사용자가 정의하거나 미리 정의되어 있다.

 

● 예외 트랩, 예외 트래핑(trapping)

 

예외가 블록의 실행 가능한 섹션에서 발생했을 때, 처리는 블록의 예외 섹션에서 해당 예외 처리기로 제어가 넘어가는 것.

 

EXCEPTION

   WHEN exception1 [OR exception2 ...] THEN

       statement1;

       statement2;

       ...

   [WHEN exception3 [OR exception4 ...] THEN

       statement1;

       statement2;

       ...]

   [WHEN OTHERS THEN

       statement1;

       statement2;

       ...]

 

- WHEN OTHERS 예외 처리기

 

  아직 트랩되지 않은 모든 예외를 트랩한다. (마지막에 정의되는 예외 처리기)

 

● 미리 정의된 예외의 사용

 

BEGIN SELECT ... COMMIT;

EXCEPTION

    WHEN NO_DATA_FOUND THEN

         statement1;

         statement2;

    WHEN TOO_MANY_ROWS THEN

         statement1;

    WHEN OTHERS THEN

         statement1;

         statement2;

         statement3;

END;

☞ 미리 정의된 오라클 서버 에러를 트랩한다.

☞ OTHERS 처리기를 사용하여 미리 정의되지 않은 오라클 서버 에러를 트랩한다.

 

● 미리 정의되지 않은 예외 사용

 

DECLARE

    e_product_invalid EXCEPTION;

    PRAGMA EXCEPTION_INIT(e_products_invalid, -2292);

    v_message VARCHAR2(50);

BEGIN

...

EXCEPTION

    WHEN e_products_invalid THEN

         :g_message := 'Product code specified is not valid.';

...

END;

 

- 무결성 제약조건 위한 오라클 서버 에러번호 - 2292에 대한 트랩.

- PRAGMA EXCEPTION_INIT 문장을 사용하여 표준 오라클 서버 에러 번호와 선언된 예외를 관련시킨다. 

 

● 사용자 정의 예외

 

RAISE문장을 사용하여 명시적으로 예외를 발생시킨다.

 

[DECLARE]

      e_amount_remaining EXCEPTION;

...

BEGIN

...

      RAISE e_amount_remaining;

...

EXCEPTION

   WHEN e_amount_remaining THEN

       :g_message := 'There is still an amount in stock.';

...

END;

 

● 예외 트래핑 함수

 

- SQLCODE : 에러코드에 대한 숫자  값을 리턴한다.

                  NUMBER 변수에 저장할 수 있다.

- SQLERRM : 에러번호와 관련된 메시지를 갖는 문자데이터를 리턴한다.

 

* SQLCODE 값 예

 SQLCODE 값

 설명 

 0

 예외가 없다.

 1

 사용자 정의 예외

 +100

 NO_DATA_FOUND 예외

 negative number

 다른 오라클 서버 에러번호

 

EX.

 

DECLARE

    v_error_code NUMBER;

    v_error_message VARCHAR2(255);

BEGIN

...

EXCEPTION

...

   WHEN OTHERS THEN

       ROLLBACK;

       v_error_code := SQLCODE;

       v_error_message := SQLERRM;

       INSERT INTO errors VALUES(v_error_code, v_error_message);

END;

 

● RAISE_APPLICATION_ERROR

 

표준화되지 않은 에러 코드와 에러 메시지를 리턴하는 프로시저이다.

 

RAISE_APPLICATION_ERROR (error_number, message [, TRUE / FALSE]);

 

error_number -20000과 20999 사이의, 예외에 대해 지정된 번호이다.

mssage         예외에 대한 사용자 지정 메시지이다. 2048바이트 길이까지의 문자열이다.

TRUE / FALSE 선택적 부울 매개변수이다. TRUE이면 에러는 이전의 에러 스택에 위치하게 된다.

                                                      FALSE(디폴트)이면, 에러는 모든 이전의 에러를 대체한다.

 

Ex. 예외 섹션에서 사용

...

EXCEPTION

   WHEN NO_DATA_FOUND THEN

        RAISE_APPLICATION_ERROR (-20201, 'Manager is not a valid employee.');

END;

 

Ex. 실행 섹션에서 사용

...

DELETE FROM emp

         WHERE mgr = v_mgr;

IF SQL%NOTFOUND THEN

   RAISE_APPLICATION_ERROR (-20202, 'This is not a valid manager');

END IF;

...

 

 

Comments