Skip to content

SQL 예외처리 #
Find similar titles

Structured data

Category
Database

예외처리 #

예외처리란 #

PL/SQL 문장을 실행중에 발생하는 오류를 EXCEPTION문을 이용하여 핸들링 하는것이다. 예외가 발생하면 PL/SQL문의 실행이 중단된다. 예외처리는 선택사항이다.

문법 #

EXCEPTION
   WHEN ex_name_1 [OR ex_name_3] THEN statements_1  -- Exception handler
  [WHEN ex_name_2 [OR ex_name_3] THEN statements_2] -- Exception handler
  [WHEN OTHERS THEN statements_3]                   -- Exception handler
END;
  • WHEN OTHERS절은 제일 마지막에 한번만 기술이 가능하다.
  • PL/SQL문장에서 예외가 발생했을때만 EXCEPTION절이 수행된다.

예외종류 #

Predefined Exceptions #

'미리 정의된 예외(Predefined Exceptions)' 는 사전에 미리 이름을 정해둔 내부적으로 정의된 Exception이고, 이 예외는 표준 패키지에서 PL/SQL이 전역적으로 선언하여 사용한다.

Predefined Exceptions 종류 #

Exception Name Error Code
ACCESS_INTO_NULL -6530
CASE_NOT_FOUND -6592
COLLECTION_IS_NULL -6531
CURSOR_ALREADY_OPEN -6511
DUP_VAL_ON_INDEX -1
INVALID_CURSOR -1001
INVALID_NUMBER -1722
LOGIN_DENIED -1017
NO_DATA_FOUND 100
NO_DATA_NEEDED -6548
NOT_LOGGED_ON -1012
PROGRAM_ERROR -6501
ROWTYPE_MISMATCH -6504
SELF_IS_NULL -30625
STORAGE_ERROR -6500
SUBSCRIPT_BEYOND_COUNT -6533
SUBSCRIPT_OUTSIDE_LIMIT -6532
SYS_INVALID_ROWID -1410
TIMEOUT_ON_RESOURCE -51
TOO_MANY_ROWS -1422
VALUE_ERROR -6502
ZERO_DIVIDE -1476

Internally Defined Exceptions #

  • '내부에 정의된 예외(Internally Defined Exceptions)'는 런타임시에 내부적으로 발생되며, '내부에 정의된 예외'는 PL/SQL이나 작성자가 이름을 지정해주지 않는한 이름을 갖지 않는다.
  • PL/SQL문장에서 이름이 없는 '내부에 정의된 예외'가 발생될것이 예상된다면 그 예외에 이름을 지정하고, 해당 예외의 고유 exception handlers를 작성하여 처리할수 있다. 그렇지 않으면 작성자는 WHEN OTHERS절에서 처리해야만 한다.

문법 #

1. 예외에 이름을 선언한다.
exception_name EXCEPTION;

2. 해당 예외의 이름과 에러코드를 맵핑한다.
PRAGMA EXCEPTION_INIT (exception_name, error_code)

3. 선언한 예외 이름으로 예외처리 한다.
EXCEPTION
  WHEN exception_name THEN statements

예제 #

DECLARE
  deadlock_detected EXCEPTION;
  PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
BEGIN
  ...
EXCEPTION
  WHEN deadlock_detected THEN
    ...
END;

User-Defined Exceptions #

작성자가 임의로 PL/SQL의 익명 블록, 서브 프로그램 또는 패키지에서 예외를 선언하여 사용할수 있다.

문법 #

1. 선언부에 임의의 예외를 선언한다.
exception_name EXCEPTION;

2. RAISE을 사용하여 임의로 예외를 발생시킨다.
RAISE exception_name;

3. 선언한 예외 이름으로 예외처리 한다.
EXCEPTION
WHEN exception_name THEN statements

예제 #

CREATE PROCEDURE account_status (
  due_date DATE,
  today    DATE
) AUTHID DEFINER
IS
  past_due  EXCEPTION;  -- declare exception
BEGIN
  IF due_date < today THEN
    RAISE past_due;  -- explicitly raise exception
  END IF;
EXCEPTION
  WHEN past_due THEN  -- handle exception
    DBMS_OUTPUT.PUT_LINE ('Account past due.');
END;


BEGIN
  account_status ('1-JUL-10', '9-JUL-10');
END;

Result:
Account past due.

References #

0.0.1_20210630_7_v33