1. Compile Error
PL/SQL Block이 Parse 되는 동안 발생하는 오류 ( 오탈자 등의 이유로 )
2. Runtime Error
PL/SQL Block이 실행되는 동안 발생하는 오류
[ 오라클 예외 ]
오라클에서 제공되는 예외
1. Predefined ORACLE Exception: 사전에 정해진 예외
ACCESS_INTO_NULL
ORA-06530
정의되지 않은 오브젝트 속성에 값을 할당하고자 했을 때 발생하는 예외
CASE_NOT_FOUND
ORA-06592
CASE문의 WHEN절에 해당되는 조건이 없고 ELSE 절도 없을 경우에 발생되는 예외
COLLECTION_IS_NULL
ORA-06531
선언되지 않은 컬렉션 (nested table, varray)에 EXISTS 이외의 메소드를 사용했을 때 발생되는 예외
CURSOR_ALREADY_OPEN
ORA-06511
이미 열린 커서를 열려고 시도했을 때 발생하는 예외
DUP_VAL_ON_INDEX
ORA-00001
유일 인덱스에 중복값을 입력했을 경우 발생되는 예외
INVALID_CURSOR
ORA-01001
잘못된 커서 조작이 실행될 때 발생하는 예외
INVALID_NUMBER
ORA-01722
문자를 숫자로의 변환 시 실패가 될 때 발생하는 예외
LOGIN_DENIED
ORA-01017
잘못된 사용자명이나 암호로 로그인을 시도했을 때 발생하는 예외
NO_DATA_FOUND
ORA-01403
PL/SQL SELECT문이 한 건도 리턴하지 못했을 경우 발생하는 예외
NOT_LOGGED_ON
ORA-01012
접속되지 않은 상태에서 데이터베이스에 대한 요청이 실행된 경우 발생하는 예외
PROGRAM_ERROR
ORA-06501
PL/SQL이 내부적인 문제를 가지고 있는 경우 발생하는 예외
ROWTYPE_MISMATCH
ORA-06504
할당문에서 호스트 커서 변수와 PL/SQL 커서 변수의 데이터 형이 불일치
STORAGE_ERROR
ORA-06500
메모리가 부족하거나 메모리상의 문제
SUBSCRIPT_BEYOND_COUNT
ORA-06533
컬렉션의 요소 개수보다 더 큰 첨자 값으로 참조한 경우
SUBSCRIPT_OUTSIDE_LIMIT
ORA-06532
컬렉션의 첨자의 한계를 벗어난 참조가 일어났을 때
SYS_INVALID_ROWID
ORA-01410
문자열을 ROWID로 변환할 때 무효한 문자열의 표현일 경우
TIMEOUT_ON_RESOURCE
ORA-00051
자원에 대한 대기시간 초과
TOO_MANY_ROWS
ORA-01422
PL/SQL SELECT문이 두 건 이상의 행을 리턴했을 때
VALUE-ERROR
ORA-06502
산술, 변환, 절삭 또는 크기 제약에 에러가 생겼을 때
ZERO_DEVIDE
ORA-01476
0으로 나누려했을 때 발생하는 예외
- 예제
DECLARE
emp_lastname employees.last_name%TYPE;
BEGIN
SELECT last_name INTO EMP_LASTNAME
FROM EMPLOYEES e
WHERE LAST_NAME LIKE 'B%';
dbms_output.put_line('사원명은 ' || emp_lastname || '입니다. ');
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('해당 사원이 없습니다.');
WHEN too_many_rows THEN
dbms_output.put_line('사원이 두 명 이상입니다.');
END;
/
- Output
2. Non - Predefined ORACLE Exception: 사전에 정해지지 않은 예외
[ 사용자 정의 예외 ]
사용자에 의해 정의되는 예외
DECLARE
예외명 exception;
BEGIN or EXCEPTION 부에서 raise문을 이용해서 예외를 발생시킴
- 예외처리부 형식 (예외 처리 내용)
Exception
when [Exception Name 1] then
Sentences..
when [Exception Name 2] then
Sentences..
when OTHERS then
Sentences..
- pragma 이용한 예제
DECLARE
emp_exist EXCEPTION;
pragma exception_init(EMP_EXIST, -2292); -- 컴파일러에게 에러코드 지정
BEGIN
-- departments table은 employees table의 부모 테이블이기 때문에
-- 자식 테이블에 해당 데이터 사원 존재하므로 삭제하면 데이터 참조 무결성 오류
DELETE FROM departments
WHERE DEPARTMENT_ID = '30';
COMMIT;
EXCEPTION
WHEN emp_exist THEN -- 참조 무결성 오류에 대한 예외처리
dbms_output.put_line('사원이 존재하므로 삭제할 수 없습니다.');
END;
/
- Output
- raise 이용한 예제
DECLARE
emp_id employees.employee_id%TYPE;
emp_name employees.last_name%TYPE;
no_emp EXCEPTION;
BEGIN
DELETE FROM EMPLOYEES e2
WHERE EMPLOYEE_ID = '300';
IF SQL%notfound THEN
raise no_emp;
END IF;
EXCEPTION
WHEN no_emp THEN
dbms_output.put_line('해당 사원이 없습니다.');
END;
/
- Output
- raise_application_error 이용한 예제
DECLARE
emp_id employees.employee_id%TYPE;
emp_name employees.last_name%TYPE;
BEGIN
DELETE FROM EMPLOYEES e2
WHERE EMPLOYEE_ID = '500';
IF SQL%notfound THEN
raise_application_error(-20111, '사원이 없습니다.');
END IF;
END;
/
- Output
'SQL' 카테고리의 다른 글
[Oracle] PL/SQL 함수 Function (0) | 2020.07.26 |
---|---|
[Oracle] PL/SQL 서브 프로그램의 이해, 프로시저 (0) | 2020.07.26 |
[Oracle] PL/SQL Cursor 의미 & 사용법 (0) | 2020.07.11 |
[Oracle] PL/SQL 반복문 (Loop, While, For Loop, Continue) (0) | 2020.07.06 |
[Oracle] PL/SQL 조건문 (if문, case문) (0) | 2020.07.06 |