Oracle

[Oracle] PL/SQL 프로시저 예외처리하기 (with RAISE & EXCEPTION)

네모세모동동 2025. 4. 16. 16:26

프로시저를 작성하면서

특정 상황에는 A 처리를, 다른 상황에서는 B 처리를 해줘야할 때가 있다.

 

예를 들어,

전표를 생성한다고 할 때 월마감을 체크하고 전표를 생성시켜줘야한다

월마감을 했는지 체크하고 그 결과에 따라 월마감 여부를 알려주거나 전표를 생성시키거나 해야한다.

이런 경우, 사용자정의 예외를 사용해서 처리해줄 수 있다.

 

물론 사용자정의 예외만 처리할 수 있는 방법이 아니라

자바에 try-catch문 처럼

컴파일 오류나 오라클에서 발생시키는 오류 또한 처리할 수 있다.

 


 

 

프로시저에서

EXCEPTION으로 예외를 선언하고 처리하고 RAISE로 예외를 발생시킬 수 있다. 

CREATE OR REPLACE PROCEDURE 프로시저이름

IS

V_CNT      NUMBER(20);
V_PRICE    NUMBER(20);

-- 사용자정의 예외 선언
ER_NEGATIVE_NUM   EXCEPTION;

BEGIN
--프로시저 로직

    RAISE ER_NEGATIVE_NUM;  -- 사용자정의 예외 발생발생

EXCEPTION
WHEN NOT_FOUND_DATA THEN		/* 오라클 오류 */
    --예외처리 로직
WHEN ER_NEGATIVE_NUM THEN		/* 사용자정의 오류 */
    --예외처리 로직
    
END;

 

 

위 코드는

프로시저에서 예외를 발생시키고 처리하는 전체적인 로직을 간단하게 작성한 예시이다.

 

위에서부터 차근차근 살펴보자!🤓

 

1. 사용자정의 예외 선언하기

내가 특정 상황에 사용하고 싶은 예외가 있는 경우, 사용자정의 예외를 사용하면 된다!

사용자정의 예외는 선언부에서 아래형식처럼 선언을 해주면 된다.

 

예외명칭  EXCEPTION; 

EX)  ER_NEGATIVE_NUM     EXCEPTION;
        ER_CLOSE                      EXCEPTION;

 

당연한 소리지만

선언을 하지 않고 사용하면 오류가 나니 꼭! 선언부에서 예외를 정의하도록 하자!🍀

 

 

2. RAISE 로  예외 던지기

오라클 에러의 경우는 자동으로 에러가 발생하겠지만

내가 직접 선언한 예외의 경우에는 'RAISE'를 통해서 직접 특정 예외 상황에 예외를 발생시켜야한다.

RAISE 발생시킬 예외명칭;

EX) RAISE  ER_NEGATIVE_NUM;

 

 

3. EXCEPTION으로 예외처리

EXCEPTION 블록에서는 예외가 발생했을 때 실행시킬 업무를 작성하면 된다.

EXCEPTION
WHEN NOT_FOUND_DATA THEN
    --예외처리 로직
WHEN NEGATIVE_NUM THEN
    --예외처리 로직

 

예시를 보면 사용자정의 예외인 NEGATIVE_NUM 외에도

데이터가 없는 경우 발생하는 NOT_FOUND_DATA 처럼 오라클에서 발생 시키는 예외에 대해서도 처리할 방식을 설정할 수 있다.

 

만약 EXCEPTION 블록에서 처리할 방식을 사용하지 않은 'ER_CLOSE' 예외를 발생시킨다면

런타임 오류가 발생한다고 한다!

 

빼먹지 않고 선언한 오류마다 처리 방식을 기입하는 것이 좋다.

그래도 내가 까먹을 혹시 모를 상황을 대비해서 포괄적으로 오류 처리를 하는 블록을 만들어 두는 것이 좋다.

이때 사용하는 것이 OTHERS !

 

OTHERS 는 정의하지 않은 예외들을 처리하는데 사용된다.

다른 예외처리와 같이 EXCEPTION 블록에 WHEN으로 명시해주고 처리로직을 작성해주면 된다!

WHEN OTHERS THEN
    -- 예외처리 로직

 

 

 


[참고]