오라클 예외처리 정리
시스템예외
예외명 | 예외코드 | 설명 |
ACCESS_INTO_NULL | ORA-06530 | LOB와 같은 객체 초기화 되지 않은 상태에서 사용 |
CASE_NOT_FOUND | ORA-06592 | CASE문 사용시 구문 오류 |
CURSOR_ALREADY_OPEN | ORA-06511 | 커서가 이미 OPEN된 상태인데 OPEN시도 |
DUP_VAL_ON_INDEX | ORA-00001 | 유일 인덱스가 있는 컬럼에 중복값으로 INSERT, UPDATE 수행 |
INVALID_CURSOR | ORA-01001 | 존재하지 않는 커서참조 |
INVALID_NUMBER | ORA-01722 | 문자를 숫자로 변환실패 |
LOGIN_DENIED | ORA-01017 | 잘못된 사용자 이름이나 비밀번호로 로그인 시도 |
NO_LOGGED_ON | ORA-01012 | 로그온되지 않은상태로 DB참조 |
NOT_DATA_FOUND | ORA-01403 | SELECT INTO 시 데이터가 한 건도 없을경우 |
PROGRAM_ERROR | ORA-06501 | PL/SQL 쿼리상에서 내부 오류를 만났을 때, 오라클에 문의 |
STORAGE_ERROR | ORA-06500 | 프로그램 수행 시 메모리가 부족할 경우 |
TIMEOUT_ON_RESOURCE | ORA-00051 | 데이터베이스 자원을 기다리는 동안 타임아웃발생 |
TOO_MANI_ROWS | ORA-01422 | SELECT INTO 문법에서 결과가 복수개 ROW일 때 |
VALUE_ERROR | ORA-06502 | 수치 또는 값 오류 |
ZERO_DIVIDE | ORA-01476 | 0으로 나눌 때 |
사용자정의 예외처리
사용자가 직접 예외를 정의하고 예외가 발생하면 EXCEPTION절에서 처리할 로직을 구현한다.
방법
1. 예외정의
사용자 예외를 변수나 상수처럼 PL/SQL 블록 선언부에 예외를 정의해야 한다.
사용자예외명 EXCEPTION; 형태로 선언한다.
1
2
|
EX)사용자예외 정의
USER_CUSTOM_EXCEPTION EXCEPTION;
|
cs |
2. 예외 발생시키기
시스템예외는 해당 예외가 자동으로 검출되지만, 사용자 정의 예외는 직접 예외를 발생시켜야 한다.
즉! 시스템예외는 오류가 발생하면 자동으로 발생됨
사용자정의 예외는 오류가 발생하는 시점에서 직접 예외를 발생시켜서 EXCEPTION 구문으로 점프시켜야함
1
2
|
EX)예외발생시키기
RAISE USER_CUSTOM_EXCEPTION;
|
cs |
3. 발생된 예외처리
예외를 발생시키면 자동으로 제어권이 EXCEPTION절로 넘어오므로
시스템예외와 동일한 방식으로 처리해주면 된다.
1
2
3
4
5
6
7
|
EX)예외처리
EXCEPTION
WHEN USER_CUSTOM_EXCEPTION THEN
DBMS_OUTPUT.PUT_LINE('사용자정의 예외입니다.');
WHEN ZERMO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('0으로 나누었습니다.');
END;
|
cs |
시스템예외에 이름 부여하기
시스템예외에는 미리 예외명이 부여된 것들도 존재하나 극소수이고
대부분은 예외코드(에러코드)만 존재한다.
이런 예외에 이름을 부여하면 코드의 가독성을 높이고, 로직을 파악하기도 쉬워진다.
방법
1. 예외정의
사용자정의 예외와 같이 선언부에 사용자정의예외를 정의한다.
2. 사용자정의예외명과 시스템예외코드 연결
1
2
|
EX)사용자정의예외명과 시스템예외코드 연결
PRAGMA EXCEPTION_INIT( 'NEW_NAME', 'ORA-00001');
|
cs |
3. 발생된 예외처리
1
2
3
4
|
EX)발생된 예외처리
EXCEPTION WHEN NEW_NAME THEN
DBMS_OUTPUT.PUT_LINE('이름이 부여된 시스템예외입니다.');
END;
|
cs |
오라클 예외처리 정리
시스템예외
예외명 | 예외코드 | 설명 |
ACCESS_INTO_NULL | ORA-06530 | LOB와 같은 객체 초기화 되지 않은 상태에서 사용 |
CASE_NOT_FOUND | ORA-06592 | CASE문 사용시 구문 오류 |
CURSOR_ALREADY_OPEN | ORA-06511 | 커서가 이미 OPEN된 상태인데 OPEN시도 |
DUP_VAL_ON_INDEX | ORA-00001 | 유일 인덱스가 있는 컬럼에 중복값으로 INSERT, UPDATE 수행 |
INVALID_CURSOR | ORA-01001 | 존재하지 않는 커서참조 |
INVALID_NUMBER | ORA-01722 | 문자를 숫자로 변환실패 |
LOGIN_DENIED | ORA-01017 | 잘못된 사용자 이름이나 비밀번호로 로그인 시도 |
NO_LOGGED_ON | ORA-01012 | 로그온되지 않은상태로 DB참조 |
NOT_DATA_FOUND | ORA-01403 | SELECT INTO 시 데이터가 한 건도 없을경우 |
PROGRAM_ERROR | ORA-06501 | PL/SQL 쿼리상에서 내부 오류를 만났을 때, 오라클에 문의 |
STORAGE_ERROR | ORA-06500 | 프로그램 수행 시 메모리가 부족할 경우 |
TIMEOUT_ON_RESOURCE | ORA-00051 | 데이터베이스 자원을 기다리는 동안 타임아웃발생 |
TOO_MANI_ROWS | ORA-01422 | SELECT INTO 문법에서 결과가 복수개 ROW일 때 |
VALUE_ERROR | ORA-06502 | 수치 또는 값 오류 |
ZERO_DIVIDE | ORA-01476 | 0으로 나눌 때 |
사용자정의 예외처리
사용자가 직접 예외를 정의하고 예외가 발생하면 EXCEPTION절에서 처리할 로직을 구현한다.
방법
1. 예외정의
사용자 예외를 변수나 상수처럼 PL/SQL 블록 선언부에 예외를 정의해야 한다.
사용자예외명 EXCEPTION; 형태로 선언한다.
1
2
|
EX)사용자예외 정의
USER_CUSTOM_EXCEPTION EXCEPTION;
|
cs |
2. 예외 발생시키기
시스템예외는 해당 예외가 자동으로 검출되지만, 사용자 정의 예외는 직접 예외를 발생시켜야 한다.
즉! 시스템예외는 오류가 발생하면 자동으로 발생됨
사용자정의 예외는 오류가 발생하는 시점에서 직접 예외를 발생시켜서 EXCEPTION 구문으로 점프시켜야함
1
2
|
EX)예외발생시키기
RAISE USER_CUSTOM_EXCEPTION;
|
cs |
3. 발생된 예외처리
예외를 발생시키면 자동으로 제어권이 EXCEPTION절로 넘어오므로
시스템예외와 동일한 방식으로 처리해주면 된다.
1
2
3
4
5
6
7
|
EX)예외처리
EXCEPTION
WHEN USER_CUSTOM_EXCEPTION THEN
DBMS_OUTPUT.PUT_LINE('사용자정의 예외입니다.');
WHEN ZERMO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('0으로 나누었습니다.');
END;
|
cs |
시스템예외에 이름 부여하기
시스템예외에는 미리 예외명이 부여된 것들도 존재하나 극소수이고
대부분은 예외코드(에러코드)만 존재한다.
이런 예외에 이름을 부여하면 코드의 가독성을 높이고, 로직을 파악하기도 쉬워진다.
방법
1. 예외정의
사용자정의 예외와 같이 선언부에 사용자정의예외를 정의한다.
2. 사용자정의예외명과 시스템예외코드 연결
1
2
|
EX)사용자정의예외명과 시스템예외코드 연결
PRAGMA EXCEPTION_INIT( 'NEW_NAME', 'ORA-00001');
|
cs |
3. 발생된 예외처리
1
2
3
4
|
EX)발생된 예외처리
EXCEPTION WHEN NEW_NAME THEN
DBMS_OUTPUT.PUT_LINE('이름이 부여된 시스템예외입니다.');
END;
|
cs |