ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Exception] RAISE 문법 활용법
    DATABASE/Oracle 2024. 9. 10. 17:14

    1. 오라클 오류 구분
    오류     ┬    런타임 에러(예외) ──┬ 시스템 예외 - NO_DATA_FOUND, PROGRAM_ERROR 등
                │                                       └ 사용자 정의 예외 (RAISE로 설정 가능)
               └ 컴파일 에러(문법 오류)

    2. 사용자 정의 예외 사용 목적
    프로시저 내부에서 사용자 정의 예외를 처리할 수 있도록 설정하는 용도로 사용

    3. 예외 생성
    1) RAISE {예외명}
        Ex) RAISE V_EXCEPTION_DELIVERED
    2) RAISE_APPLICATION_ERROR(예외코드, 메시지)
        Ex) RAISE_APPLICATION_ERROR(-20001, 'Unable to locate Sales Information.');
        ★ 예외 코드의 경우, -20000 ~ -20999까지 설정 가능

            (기존 ORACLE에서 -19999까지의 예외 코드를 이미 사용하고 있기 때문에)
    3) PRAGMA EXCEPTION_INIT(사용자정의명,시스템 예외코드)
       ★ 기존 오라클 에러와 사용자 에러 연결


    4. EXCEPTION 활용 방법(OTHERS, DBMS 출력 사용법)
    [PL/SQL 작성]

    DECLARE 
    	V_EXCEPTION_DELIVERED EXCEPTION;
    
    	/* 기존 오라클 에러와 사용자 에러 연결 : PRAGMA EXCEPTION_INIT(사용자정의명,시스템 예외코드); */
    	PRAGMA EXCEPTION_INIT (V_TEST_NO3_ERROR, -1802);
    BEGIN
    	--[1]
    	IF V_REQ_DATE IS NOT NULL THEN
    		RAISE V_EXCEPTION_DELIVERED;
    	END IF;
    
    	--[2]
    	IF V_TEST_NO1 IS NULL THEN
    		RAISE_APPLICATION_ERROR V_TEST_NO1_ERROR(-20000, 'TEST_ERR1');
    	END IF;
    
    	--[3]
    	IF V_TEST_NO2 IS NULL THEN
    		RAISE_APPLICATION_ERROR V_TEST_NO2_ERROR(-20001, 'TEST_ERR2');
    	END IF;
    
    	--[4]
    	IF V_TEST_NO3 IS NULL THEN
    		RAISE_APPLICATION_ERROR V_TEST_NO3_ERROR;
    	END IF;
    
        EXCEPTION        
            WHEN V_EXCEPTION_DELIVERED THEN -- [1]
                DBMS_OUTPUT.PUT_LINE('판매일자 오류');
                RAISE_APPLICATION_ERROR(-20002, 'This order has been processed, Unable to modify Sales Date.');
            WHEN OTHERS THEN --[1]을 제외한 모든 EXCEPTION
                DBMS_OUTPUT.PUT_LINE(SQLCODE);
                DBMS_OUTPUT.PUT_LINE(SQLERRM);
                DBMS_OUTPUT.PUT_LINE('실행 중 오류 발생');
    END;



    [결과]

    --[1] V_EXCEPTION_DELIVERED 발생 시
    판매일자 오류
    ORA-20002: This order has been processed, Unable to modify Sales Date.
    
    --[2] V_TEST_NO1_ERROR 발생 시 (OTHERS)
    20000
    ORA-20000: TEST_ERR1
    실행 중 오류 발생
    
    --[3] V_TEST_NO2_ERROR 발생 시 (OTHERS)
    -20001
    ORA-20001: TEST_ERR2
    실행 중 오류 발생
    
    --[4] [3] V_TEST_NO3_ERROR 발생 시 (OTHERS)
    -1802
    ORA-01802: Julian date is out of range
    실행 중 오류 발생




    5. OracleException 을 통한 활용
    OracleException의 Message를 사용하여 Raise 시 선언한 메세지 활용 가능
    다만, Message를 그대로 사용하는 경우 아래와 같은 형식으로 출력되기 때문에 문자열 처리 필요
    예시 ) ORA-20001: ValidateCannotChangeSaleDate\nORA-06512:  1행 

    [활용 예제]

    try{
    	// 내부 PL/SQL문에서 RAISE 사용
    }
    catch (OracleException oracleEx)
    {
    	if (20000 <= oracleEx.Number && oracleEx.Number <= 20999)
    	{
    		result.StatusDetailCode = oracleEx.Message.Substring(0, oracleEx.Message.IndexOf("\n")).Substring(oracleEx.Message.IndexOf("Validate"));
    	}
    	else
    	{
    		throw oracleEx;
    	}
    }
    catch (Exception ex)
    {
    	throw ex;
    }

    'DATABASE > Oracle' 카테고리의 다른 글

    ORACLE LISTAGG - NVARCHAR2 사용 방법  (0) 2023.05.23
Designed by Tistory.