728x90
반응형
SMALL
[문제] 사원번호를 입력값으로 받아서 그 사원의 근무 연수를 출력하고 근무 연수가 20년 이상이면 급여를 20% 인상한 급여로 수정, 20년 보다 작고 17년 보다 크거나 같으면 10%인상한 급여로 수정, 17년 미만인 근무자는 아무 작업을 수행하지 않는 프로그램을 작성하세요. (테스트가 끝나면 rollback 합니다.)
BEGIN
sal_update_proc(100);
rollback;
END;
/
100 사원은 근무 연수가 20년 입니다. 이전 급여는 26400 수정된 급여는 31680 입니다.
BEGIN
sal_update_proc(103);
rollback;
END;
/
103 사원은 근무 연수가 17년 입니다. 이전 급여는 9000 수정된 급여는 9900 입니다.
BEGIN
sal_update_proc(107);
rollback;
END;
/
107 사원은 근무 연수가 16년 입니다. 4200 급여는 수정 안됩니다.
# IF문
CREATE OR REPLACE PROCEDURE sal_update_proc (
p_id NUMBER )
IS
v_year NUMBER;
v_sal_before NUMBER;
v_sal_after NUMBER;
BEGIN
SELECT salary, trunc(months_between(sysdate, hire_date)/12)
INTO v_sal_before, v_year
FROM employees
WHERE employee_id = p_id;
IF v_year >= 20 then
UPDATE employees
SET salary = salary * 1.20
WHERE employee_id = p_id;
SELECT salary
INTO v_sal_after
FROM employees
WHERE employee_id = p_id;
dbms_output.put_line(p_id||' 사원은 근무 연수가 '||v_year||'년 입니다. 이전 급여는 '||v_sal_before|| ' 수정된 급여는 '||v_sal_after ||' 입니다.');
ELSIF v_year < 20 and v_year >= 17 THEN
UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = p_id;
SELECT salary
INTO v_sal_after
FROM employees
WHERE employee_id = p_id;
dbms_output.put_line(p_id||' 사원은 근무 연수가 '||v_year||'년 입니다. 이전 급여는 '||v_sal_before|| ' 수정된 급여는 '||v_sal_after ||' 입니다.');
ELSE
dbms_output.put_line(p_id||' 사원은 근무 연수가 '||v_year||'년 입니다. '||v_sal_before||' 급여는 수정 안됩니다.');
END IF;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line(p_id ||' 존재하지 않는 사원입니다.');
WHEN others THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END sal_update_proc;
/
# CASE문
CREATE OR REPLACE PROCEDURE sal_update_proc(p_id number)
IS
v_year number;
v_sal_before number;
v_sal_after number;
BEGIN
SELECT salary, trunc(months_between(sysdate, hire_date)/12)
INTO v_sal_before, v_year
FROM employees
WHERE employee_id = p_id;
CASE
WHEN v_year >= 20 THEN
UPDATE employees
SET salary = salary * 1.20
WHERE employee_id = p_id;
SELECT salary
INTO v_sal_after
FROM employees
WHERE employee_id = p_id;
dbms_output.put_line(p_id||' 사원은 근무 연수가 '||v_year||'년 입니다. 이전 급여는 '||v_sal_before|| ' 수정된 급여는 '||v_sal_after ||' 입니다.');
WHEN v_year < 20 and v_year >= 17 THEN
UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = p_id;
SELECT salary
INTO v_sal_after
FROM employees
WHERE employee_id = p_id;
dbms_output.put_line(p_id||' 사원은 근무 연수가 '||v_year||'년 입니다. 이전 급여는 '||v_sal_before|| ' 수정된 급여는 '||v_sal_after ||' 입니다.');
ELSE
dbms_output.put_line(p_id||' 사원은 근무 연수가 '||v_year||'년 입니다. '||v_sal_before||' 급여는 수정 안됩니다.');
END CASE;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line(p_id ||' 존재하지 않는 사원입니다.');
WHEN others THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END sal_update_proc;
/
728x90
반응형
LIST
'문제 > SQL' 카테고리의 다른 글
231106 PL/SQL 복습 겸 문제 (1) | 2023.11.06 |
---|---|
231103 PL/SQL 복습 겸 문제 (0) | 2023.11.06 |
231101 PL/SQL 복습 겸 문제 (1) | 2023.11.01 |
231031 PL/SQL 문제 (0) | 2023.10.31 |
231031 복습 겸 문제 (1) | 2023.10.31 |