RAISE와 RAISE_APPLICATION_ERROR
사용자 정의 예외를 명시적으로, 즉 의도적으로 발생시키기 위해서 “RAISE 사용자_정의_예외명”을 사용했다. 또한 사용자 정의 예외명 대신 미리 정의된 예외명을 명시해서 사용할 수도 있었다. 즉 사용자 정의 예외명을 선언하고 미리 정의된 예외코드를 연결하거나 사용자 정의 예외를 선언하지 않고 바로 미리 정의된 예외를 발생시킬 수도 있다. 예를 들어, 매개변수로 정수를 받아 처리하는 프로시저가 있는데 반드시 양수만 입력받아 처리해야 한다면, 다음과 같이 INVALID_NUMBER 예외를 발생시킬 수 있다.
입력
CREATE OR REPLACE PROCEDURE ch10_raise_test_proc ( 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;
결과
PROCEDURE CH10_RAISE_TEST_PROC이(가) 컴파일되었습니다.
입력
EXEC ch10_raise_test_proc (-10);
결과
양수만 입력받을 수 있습니다
그런데 RAISE 외에도, 예외를 발생시킬 수 있는 RAISE_APPLICATION_ERROR란 프로시저가 존재한다. 이 프로시저는 DBMS_STANDARD 시스템 패키지에 속한 프로시저로 사용자 정의 예외만 발생시킬 수 있는데, 예외 코드와 원하는 예외 메시지를 직접 매개변수로 넘겨 예외를 발생시키는 것이 특징이다. 사용법은 다음과 같다.
RAISE_APPLICATION_ERROR (예외코드, 예외 메시지);
예외 코드와 예외 메시지는 사용자가 직접 정의할 수 있는데, 예외코드는 -20000 ~ -20999 번까지만 사용할 수 있다. 왜냐하면 오라클에서 이미 사용하고 있는 시스템 예외들이 위 번호 구간은 사용하고 있지 않기 때문이다. 그럼 ch10_raise_test_proc 프로시저를 수정해 RAISE_APPLICATION_ERROR 프로시저가 어떤 식으로 동작하는지 살펴보자.
입력
CREATE OR REPLACE PROCEDURE ch10_raise_test_proc ( 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(SQLCODE);
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
결과
PROCEDURE CH10_RAISE_TEST_PROC이(가) 컴파일되었습니다.
입력
EXEC ch10_raise_test_proc (-10);
결과
-20000
ORA-20000: 양수만 입력받을 수 있단 말입니다!
실행 결과를 보면 알 수 있듯이, 매개변수가 음수로 들어오면 RAISE_APPLICATION_ERROR가 호출되고 이 프로시저의 매개변수로 넘긴 예외코드와 예외 메시지가 EXCEPTION 절의 OTHERS에서 걸러져 SQLCODE는 -20000, SQLERRM는 “양수만 입력받을 수 있단 말입니다!”를 반환하게 된다.