본문 바로가기
BackEnd/DB, SQL

SQL 23편: 예외 처리

by summer_light 2022. 1. 25.

오류, 예외

오류는 크게 두 가지로 구분된다. 

1) 문법이 잘못되었거나 오타로 인한 오류: 컴파일 오류=문법 오류

2) 명령문의 실행 중 발생한 오류: 런타임 오류=실행 오류

이 중에서 오라클은 런타임 오류=실행 오류예외라고 한다. 

 

 

 

 


예외 처리부

예외 처리는 예외가 발생하였을 때 프로그램이 비정상 종료가 되는 것을 막기 위해 EXCEPTION 영역에 필요 코드를 작
성하는 것을 뜻한다. 예외 처리부가 실행되면 예외가 발생한 코드 이후의 내용은 실행 되지 않는다. WHEN~THEN 절을 예외 핸들러라고 한다. 

 

 

기본형식

EXCEPTION

WHEN 예외이름1[OR 예외이름2] THEN

예외 처리에 사용할 명령어;

WHEN 예외이름3[OR 예외이름4] THEN

예외 처리에 사용할 명령어;

...

WHEN OTHERS THEN

예외 처리에 사용할 명령어;

 

예제 

DECLARE
   v_wrong NUMBER;
BEGIN
   SELECT DNAME INTO v_wrong
     FROM DEPT
    WHERE DEPTNO = 10;
EXCEPTION
   WHEN VALUE_ERROR THEN
      DBMS_OUTPUT.PUT_LINE('예외 처리 : 수치 또는 값 오류 발생');
END;
/

 

 

 

 


예외 종류

내부 예외 사전 정의된 예외 내부 예외 중 예외 번호에 해당하는 이름이 존재하는 예외
이름이 없는 예외 내부 예외 중 이름이 존재하지 않는 예외
사용자 정의 예외 사용자가 직접 정의한 예외

- 사전 정의된 예외는 비교적 자주 발생하는 예외에 이름을 붙여 놓은 것이다.

- 이에 비해 이름 없는 예외는 ORA-XXXXX 와 같이 예외 번호는 있지만 이름이 정해져 있지는 않은 예외를 뜻한다. 이름이 없는 예외는 예외 처리부에서 사용하기 위해 이름을 직접 붙여 사용한다. 

 

 

1) 사전 정의된 예외 사용하기

DECLARE
   v_wrong NUMBER;
BEGIN
   SELECT DNAME INTO v_wrong
     FROM DEPT
    WHERE DEPTNO = 10;

   DBMS_OUTPUT.PUT_LINE('예외가 발생하면 다음 문장은 실행되지 않습니다');

EXCEPTION
   WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('예외 처리 : 요구보다 많은 행 추출 오류 발생');
   WHEN VALUE_ERROR THEN
      DBMS_OUTPUT.PUT_LINE('예외 처리 : 수치 또는 값 오류 발생');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('예외 처리 : 사전 정의 외 오류 발생');
END;
/

 

 

2) 이름 없는 예외 사용하기

DECLARE 

예외이름1 EXCEPTION;

PRAGMA EXCEPTION_INIT(예외이름1, 예외번호);

 

EXCEPTION

WHEN 예외이름1 THEN

예외 처리 명령어;

 

END;

 

 

3) 사용자 정의 예외 사용하기 

DECLARE 

사용자예외이름1 EXCEPTION;

 

BEGIN 

IF 예외발생조건 THEN

RAISE 사용자예외이름

...

END IF;

 

EXCEPTION

WHEN 예외이름1 THEN

예외 처리 명령어;

 

END;

 

 

 

 


오류 코드와 오류 메시지 사용하기

발생한 오류 내역을 알고 싶을 때, SQLCODE, SQLERRM 함수를 사용한다. SQLCODE와 SQLERRM은 PL/SQL에서만 사용 가능한 함수로 SQL문에서는 사용할 수 없다. 

DECLARE
   v_wrong NUMBER;
BEGIN
   SELECT DNAME INTO v_wrong
     FROM DEPT
    WHERE DEPTNO = 10;

   DBMS_OUTPUT.PUT_LINE('예외가 발생하면 다음 문장은 실행되지 않습니다');

EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('예외 처리 : 사전 정의 외 오류 발생');
      DBMS_OUTPUT.PUT_LINE('SQLCODE : ' || TO_CHAR(SQLCODE));
      DBMS_OUTPUT.PUT_LINE('SQLERRM : ' || SQLERRM);
END;
/

댓글