본문 바로가기

DB/Oracle

[Oracle] EXCEPTION(예외처리) 예제

요구사항 : 사원 번호와 급여 인상/인하율을 입력받아 현재 급여와 비교하며 결과 도출

그러나 인상된 금액은 해당 직무의 최소, 최대 급여의 범위를 넘지못함. 또한 입력받은 사원 번호가 존재하지 않는다면 예외처리

 

Step 1. 예외 처리 없이 수행되도록 만들기

 

CREATE OR REPLACE PROCEDURE chk_salary (p_id employees.employee_id%TYPE, p_num NUMBER)
IS

       l_name employees.last_name%TYPE;
       before_salary employees.salary%TYPE;
      after_salary employees.salary%TYPE;

BEGIN

      SELECT last_name, salary
      INTO l_name, before_salary
      FROM employees
      WHERE employee_id = p_id;

      after_salary := before_salary + ( before_salary * (p_num / 100));

     DBMS_OUTPUT.PUT_LINE(p_id || ' ' || l_name || ' ' || before_salary || ' ' || after_salary);

END;

 

Step 2. 예외처리 추가

 

CREATE OR REPLACE PROCEDURE chk_salary( p_id employees.employee_id%TYPE, p_num NUMBER)
IS

      l_name employees.last_name%TYPE;
      l_job employees.job_id%TYPE;
      before_salary employees.salary%TYPE;
      after_salary employees.salary%TYPE;
      l_min jobs.min_salary%TYPE;
      l_max jobs.max_salary%TYPE;

      chk_range EXCEPTION;

BEGIN

     SELECT last_name, job_id, salary
     INTO l_name, l_job, before_salary
     FROM employees
     WHERE employee_id = p_id;


     SELECT min_salary, max_salary
     INTO l_min, l_max
     FROM jobs
     WHERE job_id = l_job;


    after_salary := before_salary + ( before_salary * (p_num / 100));


    IF ( after_salary < l_min ) OR ( after_salary > l_max ) THEN
             RAISE chk_range;
    END IF;


   DBMS_OUTPUT.PUT_LINE(p_id || ' ' || l_name || ' ' || before_salary || ' ' || after_salary);


   EXCEPTION
   WHEN NO_DATA_FOUND THEN
               DBMS_OUTPUT.PUT_LINE('해당하는 사원이 없습니다.');
   WHEN chk_range THEN
              DBMS_OUTPUT.PUT_LINE('해당 직무의 최소, 최대 급여 범위를 초과하였습니다.');
   WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE('관리자에게 문의하세요.');


END;