본문 바로가기

DB

Oracle PL/SQL 프로시저[사용자 정의예외처리]

반응형

사용자 정의 예외를 명시적으로, 즉 의도적으로 발생시키기 위해서  'RAISE_사용자_정의_예외명" 을 사용했다. 또한 사용자 정의 예외명 대신 미리 정의된 예외명을 명시해서 사용할 수도 있다. 즉 사용자 정의 예외명을 선언하고 미리 정의된 예외코드를 연결하거나 사용자 정의 예외를 선언하지 않고 바로 미리 정의된 예외를 발생시킬 수도 있다. 예를 들어 매개변수로 정수를 받아 처리하는 프로시저가 있는데 반드시 양수만 입력받아 처리해야 한다면 다음과 같이 INVALID_NUMBER  예외를 발생시킬 수 있다.

 

create or replace PROCEDURE RAISE_TEST(
    P_NUM NUMBER)
    
    IS
    BEGIN
        IF P_NUM <= 0 THEN
            RAISE INVALID_NUMBER;
            END IF;
            DBMS_OUTPUT.PUT_LINE(P_NUM);
            EXCEPTION
            WHEN INVALID_NUMBER THEN
                DBMS_OUTPUT.PUT_LINE('양수만받을 수 있습니다,');
            WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
EXECUT RAISE_TEST(-10);

그런데  RAISE 외에도, 예외를 발생시킬수 있는 RAISE_APPLICATION_ERROR 란 프로시저가 존재한다. 이 프로시저는 DBMS_STANDARD 시스템 패키지에 속한 프로시저로 사용자 정의 예외만 발생시킬 수 있는데, 예외 코드와 원하는 예외 메시지를 직접 매개변수로 넘겨 예외를 발생시키는 것이 특징이다. 

 

RAISE_APPLICATION_ERROR(예외코드,예외 메시지);
create or replace PROCEDURE RAISE_TEST(
    P_NUM NUMBER)
    
    IS
    BEGIN
        IF P_NUM <= 0 THEN
           -- RAISE INVALID_NUMBER;
            RAISE_APPLICATION_ERROR(-20000, '양수만 입력 받을수 있습니다.');
            END IF;
            DBMS_OUTPUT.PUT_LINE(P_NUM);
            
            EXCEPTION
            WHEN INVALID_NUMBER THEN
                DBMS_OUTPUT.PUT_LINE('양수만받을 수 있습니다,');
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM);
                DBMS_OUTPUT.PUT_LINE(SQLCODE);
END;

예외 코드와 예외메시지는 사용자가 직접 정의할 수 있는데, 예외코드는 -2000 ~ -20999 번까지만 사용할수 있다.

오라클에서 이미 사용하고 있는 시스템 예외들이 위 번호 구간은 사용하고 있지 않기 때문이다.

 

매개변수가 음수로 들어오면 RAISE_APPLICATION_ERROR가 호출되고 이 프로시저의 매개변수로 넘긴 예외코드와 예외 메시지가 EXCEPTION 절의 OTHERS 에서 걸러져 SQLCODE는 -2000,SQLERRM 는 "양수만 입력받을 수 있습니다"! 를 반환하게 된다.

 

반응형