/*
예외 처리
-- 에러
1. 컴파일 에러 : PL/SQL 블록이 parse(구문 분석)되는 동안에 발생되는 에러(사용자의 오타...)
2. 런타임 에러(=exception) :
PL/SQL 블록이 실행되는 동안 발생하는 에러
a. 오라클 예외
- 오라클에서 제공되는 예외
ㄱ. Predefined Oracle Exception
사전에 정해진 예외
ㄴ. Non-predefined ORACLE Exception
사전에 정해지지 않은 예외
b. 사용자 정의 예외
사용자에 의해 정의되는 예외
declare(선언) 부에서
예외명 exception;
begin(실행)부나 exception(예외처리)부에서 raise 문을 이용해서 예외를 발생
예외처리부 : 예외 발생시 어떻게 처리할 것인지에 대한 예외 처리내용이 들어감
- 예외처리부 형식
Exception
when 예외명 then
실행문..
when 예외명2 then
실행문..
...
when OTHERS then -- 예외상황이 아닐 경우
실행문..
*/
-- predefined oracle Exception
declare
emp_lastname employees.last_name%type;
begin
select last_name into emp_lastname
from employees
where last_name like 'B%';
dbms_output.put_line('사원명은 : ' || emp_lastname || '입니다');
exception -- 결과가 없거나 2개 이상일 경우에 대한 예외처리
when no_data_found then
dbms_output.put_line('해당 사원이 없습니다.');
when too_many_rows then
dbms_output.put_line('사원이 2명 이상입니다.');
end;
/
set serveroutput on;
-- 사용자 정의 예외처리
-- pragma 이용한 예외처리
declare
emp_exist exception; -- 예외명 적어주기
pragma exception_init(emp_exist, -2292); -- pragma 키워드 : 컴파일러에게 지시를 해줌(emp_eixst 예외를 -2292코드로 처리하겠다...)
begin
delete departments
where department_id = &deptno; -- 사용자로부터 입력받아서 지우겠다
commit;
exception
when emp_exist then
dbms_output.put_line('사원이 존재합니다..... 지울 수 없어요!!');
end;
/
-- raise 이용한 예외처리
declare
emp_id employees.employee_id%type;
emp_name employees.last_name%type;
no_emp exception;
begin
delete employees
where employee_id = &empid;
if sql%notfound then-- 묵시적 커서 이용(employee_id가 없을 경우)
raise no_emp; -- no_emp로 발생시키겠다
end if;
exception
when no_emp then
dbms_output.put_line('해당 사원이 없습니다.');
end;
/
-- raise_application_error 프로시저 이용 (이용 가능한 번호 : 20000~29999)
declare
emp_id employees.employee_id%type;
emp_name employees.last_name%type;
begin
delete employees
where employee_id = &empi;
if sql%notfound then
raise_application_error(-20111, '사원이 없습니다..');
end if;
end;
/