요구사항 : 사원 번호와 급여 인상/인하율을 입력받아 현재 급여와 비교하며 결과 도출
그러나 인상된 금액은 해당 직무의 최소, 최대 급여의 범위를 넘지못함. 또한 입력받은 사원 번호가 존재하지 않는다면 예외처리
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;
'DB > Oracle' 카테고리의 다른 글
[Oracle] 오라클 쿼리 SP_CONTRACT_VALUE_ITEM_INSERT& SP_CONTRACT_VALUE_ITEM_UPDATE (0) | 2022.08.26 |
---|---|
[Oracle] 사용자 정의 함수(Stored Function) (0) | 2022.08.23 |
[Oracle] ORA-06550 & EXCEPTION(예외처리) (0) | 2022.08.16 |
[Oracle] 커서(Cursor) 예제들 (0) | 2022.08.11 |
[Oracle] 커서(Cursor) (0) | 2022.08.10 |