/*
  예외 처리
  -- 에러
    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;
/


+ Recent posts