C#,Delphi,Oracle,MSSQL 개발자블로그
[Oracle/기본]23. 예외 처리 본문
● 예외를 일으키는 두 가지 방법
1. 오라클 에러가 발생하면 관련 예외는 자동적으로 일어난다. 예를 들면, 질의 문장의 데이터베이스에서 읽어 들인 행이 아무것도 없을 때,
ORA-01403가 발생하면, 이 때 PL/SQL은 예외 NO_DATA_FOUND를 일으킨다.
2. 블록 내에서 RAISE 문장을 써서 명시적으로 예외를 일으킨다. 예외는 사용자가 정의하거나 미리 정의되어 있다.
● 예외 트랩, 예외 트래핑(trapping)
예외가 블록의 실행 가능한 섹션에서 발생했을 때, 처리는 블록의 예외 섹션에서 해당 예외 처리기로 제어가 넘어가는 것.
EXCEPTION
WHEN exception1 [OR exception2 ...] THEN
statement1;
statement2;
...
[WHEN exception3 [OR exception4 ...] THEN
statement1;
statement2;
...]
[WHEN OTHERS THEN
statement1;
statement2;
...]
- WHEN OTHERS 예외 처리기
아직 트랩되지 않은 모든 예외를 트랩한다. (마지막에 정의되는 예외 처리기)
● 미리 정의된 예외의 사용
BEGIN SELECT ... COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;
☞ 미리 정의된 오라클 서버 에러를 트랩한다.
☞ OTHERS 처리기를 사용하여 미리 정의되지 않은 오라클 서버 에러를 트랩한다.
● 미리 정의되지 않은 예외 사용
DECLARE
e_product_invalid EXCEPTION;
PRAGMA EXCEPTION_INIT(e_products_invalid, -2292);
v_message VARCHAR2(50);
BEGIN
...
EXCEPTION
WHEN e_products_invalid THEN
:g_message := 'Product code specified is not valid.';
...
END;
- 무결성 제약조건 위한 오라클 서버 에러번호 - 2292에 대한 트랩.
- PRAGMA EXCEPTION_INIT 문장을 사용하여 표준 오라클 서버 에러 번호와 선언된 예외를 관련시킨다.
● 사용자 정의 예외
RAISE문장을 사용하여 명시적으로 예외를 발생시킨다.
[DECLARE]
e_amount_remaining EXCEPTION;
...
BEGIN
...
RAISE e_amount_remaining;
...
EXCEPTION
WHEN e_amount_remaining THEN
:g_message := 'There is still an amount in stock.';
...
END;
● 예외 트래핑 함수
- SQLCODE : 에러코드에 대한 숫자 값을 리턴한다.
NUMBER 변수에 저장할 수 있다.
- SQLERRM : 에러번호와 관련된 메시지를 갖는 문자데이터를 리턴한다.
* SQLCODE 값 예
SQLCODE 값 |
설명 |
0 |
예외가 없다. |
1 |
사용자 정의 예외 |
+100 |
NO_DATA_FOUND 예외 |
negative number |
다른 오라클 서버 에러번호 |
EX.
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE;
v_error_message := SQLERRM;
INSERT INTO errors VALUES(v_error_code, v_error_message);
END;
● RAISE_APPLICATION_ERROR
표준화되지 않은 에러 코드와 에러 메시지를 리턴하는 프로시저이다.
RAISE_APPLICATION_ERROR (error_number, message [, TRUE / FALSE]);
error_number -20000과 20999 사이의, 예외에 대해 지정된 번호이다.
mssage 예외에 대한 사용자 지정 메시지이다. 2048바이트 길이까지의 문자열이다.
TRUE / FALSE 선택적 부울 매개변수이다. TRUE이면 에러는 이전의 에러 스택에 위치하게 된다.
FALSE(디폴트)이면, 에러는 모든 이전의 에러를 대체한다.
Ex. 예외 섹션에서 사용
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201, 'Manager is not a valid employee.');
END;
Ex. 실행 섹션에서 사용
...
DELETE FROM emp
WHERE mgr = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR (-20202, 'This is not a valid manager');
END IF;
...
'Programming > Oracle 공부' 카테고리의 다른 글
[Oracle/PLSQL]3.프로시저 작성 (0) | 2017.06.07 |
---|---|
[Oracle/PLSQL]1.PL/SQL 개요 (0) | 2017.06.07 |
[Oracle/기본]22. 고급 명시적 커서 개념 (0) | 2017.05.31 |
[Oracle/기본]21. 명시적 커서 작성 (0) | 2017.05.31 |
[Oracle/기본]20. 조합 데이터 형과 작업 (0) | 2017.05.31 |