-
[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