SQL
예외처리
#
Find similar titles
Structured data
- Category
- Database
Table of Contents
예외처리 #
예외처리란 #
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.