PL SQL

PL/SQL 예외 처리 (Exception Handling) - 5 (RAISE_APPLICATION_ERROR)

n.han 2016. 7. 6. 14:20

 [RAISE_APPLICATION_ERROR 프로시저] 

  20000~20999까지의 에러 숫자는 비워져 있다. 이 에러 숫자에 사용자 정의 오류 메시지를 실행 시킬 수 있다. RAISE_APPLICATION_ERROR 프로시저는 다음과 같은 Syntax로 사용된다.

RAISE_APPLICATION_ERROR (error_number, message [, {TRUE | FALSE}];

 

 

 

error_number는 사용자 정의 에러 숫자로, 20000 ~ 20999까지의 범위를 갖는다. message는 사용자 정의 오류 메시지이다. TRUE, FALSE는 이미 정의된 에러 메시지를 출력할 것인지 여부를 표현한다.

 

다음은 사용자가 만든 에러를 통해서 프로그램이 비정상 종료되는 예제이다. 따라서 이는 특정 상황에서 프로그램을 강제 종료 시키고 사용자 정의 에러를 출력하는 것이다.

 

BEGIN
  UPDATE dept SET dname = 'Testing' WHERE deptno = 50 ;
  IF SQL%NOTFOUND THEN
    RAISE_APPLICATION_ERROR ( -20001, 'No such department id.' ) ;
  END IF;
END;
/
ERROR at line 1:
ORA-20001: No such department id.
ORA-06512: at line 7

 

다음은 사용자가 만든 에러를 처리기를 통해서 예외 처리하고, 정상 종료되는 예제이다. 정상 종료되기 때문에, 모든 명령문이 정상 수행된다. 하나하나 개별적으로 처리하고자 한다면, 해당 에러 숫자를 미리 정의되지 않은 예외로 다루면 된다.

 

BEGIN
  UPDATE dept SET dname = 'Testing' WHERE deptno = 50 ;
  IF SQL%NOTFOUND THEN
    RAISE_APPLICATION_ERROR ( -20001, 'No such department id.' ) ;
  END IF;
EXCEPTION
WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE(SQLERRM) ;
END;
/
ORA-20001: No such department id.
PL/SQL procedure successfully completed
.

 

다음은 RAISE_APPLICATION_ERROR를 TRUE로 속성 추가하여 원래 정의된 오류도 출력하는 예제이다.

 

DECLARE
  emp_rec emp%ROWTYPE ;
BEGIN
  SELECT * INTO emp_rec FROM emp WHERE deptno = 10 ;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
  RAISE_APPLICATION_ERROR ( -20001, 'Too Many Rows', TRUE ) ;
END ;
/
ERROR at line 1:
ORA-20001: Too Many Rows
ORA-06512: at line 9
ORA-01422: exact fetch returns more than requested number of rows