오라클 PL/SQL에서 사용자 정의 예외를 사용하는 방법에 대해 알아보도록 하겠습니다. 예외는 반드시 코드와 메시지가 동반합니다. 사용자 정의 예외 또한 코드가 필요한 법이지요~ 사용할 수 있는 오류코드는 -20000부터 -20999 범위입니다. 다음과 같이 사용자 정의 예외를 준비해 보았습니다.
사용자 정의 예외에 대한 설명은 아래에 있습니다.
SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
BEOMSANG VARCHAR2 (8);
BEGIN
BEGIN
SELECT DUMMY INTO BEOMSANG FROM DUAL;
RAISE_APPLICATION_ERROR (-20000, '-20000!');
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE ('SQLCODE: ' || SQLCODE || ', SQLERRM: ' || SQLERRM);
END;
RAISE_APPLICATION_ERROR (-20001, '-20001!');
DBMS_OUTPUT.PUT_LINE ('completed');
EXCEPTION
WHEN OTHERS
THEN
--ORA-20002: -20002!
--RAISE_APPLICATION_ERROR (-20002, '-20002!');
DBMS_OUTPUT.PUT_LINE ('SQLCODE: ' || SQLCODE || ', SQLERRM: ' || SQLERRM);
END;
/
SQLCODE: -20000, SQLERRM: ORA-20000: -20000!
SQLCODE: -20001, SQLERRM: ORA-20001: -20001!
PL/SQL procedure successfully completed.
우선 PL/SQL BEGIN 파트에서 다시 PL/SQL 블록을 추가하였으며, 해당 BEGIN 파트 안에 'RAISE_APPLICATION_ERROR (-20000, '-20000!');'와 같이 예외를 의도적으로 발생시켰습니다. 출력을 보면 예외가 발생하였음에도 서브 프로그램을 벗어나서 계속 동작을 한다는 것을 확인할 수 있습니다. 예외처리를 하였기 때문이지요.
그러나 'RAISE_APPLICATION_ERROR (-20001, '-20001!');' 파트를 맞이하여 예외가 발생하기 때문에 실행부의 마지막 'DBMS_OUTPUT.PUT_LINE ('completed');' 출력에는 도달할 수 없는 것을 확인할 수 있습니다.
더불어 예외 처리부에 'RAISE_APPLICATION_ERROR (-20002, '-20002!');' 부분을 주석처리 해놓았는데요, 주석이 되어 있지 않다면 해당 예외는 애플리케이션으로 throw하는 형태를 취하게 됩니다.
내부 사용자 정의 예외 -20000 이 없었다면 'completed'까지 도달하였을 것입니다.