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

 

 

 

복사했습니다!