문제/SQL

231102 PL/SQL 문제

잇꼬 2023. 11. 2. 17:28
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