문제/SQL

231027 PL/SQL 복습 겸 문제

잇꼬 2023. 10. 30. 09:22
728x90
반응형
SMALL

[문제] 사원번호를 입력값으로 받아서 그 사원의 급여를 출력하는 프로그램을 작성합니다. 또한, 급여 1000당 별(*) 하나를 출력해주세요.

내가 작성한 코드)

DECLARE
    v_id hr.employees.employee_id%TYPE;
    v_sal hr.employees.salary%TYPE;
    v_str varchar2(20) := NULL;
BEGIN
    SELECT employee_id, salary
    INTO v_id, v_sal
    FROM hr.employees
    WHERE employee_id = 200;    
    
    FOR i IN 1 .. (v_sal/1000) LOOP
        v_str := v_str||'*';
    END LOOP;
    
    DBMS_OUTPUT.PUT_LINE('사원번호 : '||v_id);
    DBMS_OUTPUT.PUT_LINE('급여 : '||v_sal);
    DBMS_OUTPUT.PUT_LINE('별점 : '||v_str);
END;
/

 

가독성이 좋은 코드)

DECLARE
    v_id hr.employees.employee_id%TYPE := 200;
    v_sal hr.employees.salary%TYPE;
    v_star varchar2(30);
BEGIN
    SELECT salary
    INTO v_sal
    FROM hr.employees
    WHERE employee_id = v_id;    
    
    FOR i IN 1 .. trunc(v_sal/1000) LOOP
        v_star := v_star||'*'; -- null||문자 = 문자 
    END LOOP;
    
    DBMS_OUTPUT.PUT_LINE('사원번호 : '||v_id);
    DBMS_OUTPUT.PUT_LINE('급여 : '||v_sal);
    DBMS_OUTPUT.PUT_LINE('별점 : '||v_star);
END;
/

 

[문제] 사원들의 근속 연수가 20년이상이면 10% 인상 급여로 수정하는 프로그램을 생성해주세요. 

 

<화면결과>
1. 100 사원의 입사일은 03/06/17 근속연수는 20년 입니다.
2. 100 사원의 급여가 26400 -> 29040 수정했습니다. (UPDATE)

 

먼저 SELECT 문으로 TEST 해보자!

SELECT Employee_id,   hire_date,    salary,
    trunc(months_between(sysdate, hire_date) / 12) 근속연수
FROM    hr.employees
WHERE     employee_id = 100;

UPDATE HR.EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE EMPLOYEE_ID = 100;

ROLLBACK;

그리고 나서 PL/SQL 코드로 작성!

DECLARE
    v_id hr.employees.employee_id%TYPE := 100;
    v_hiredate hr.employees.hire_date%TYPE;
    v_sal hr.employees.salary%TYPE;
BEGIN
    SELECT hire_date, salary
    INTO v_hiredate, v_sal
    FROM hr.employees
    WHERE employee_id = v_id;
    
    UPDATE hr.employees
    SET salary = (salary*1.1)
    WHERE employee_id = v_id;
    --dbms_output.put_line(SQL%ROWCOUNT);
    --v_sal := (v_sal*1.1);
    
    --v_hiredate := trunc(months_betweens(sysate, v_hiredate)/12);
    DBMS_OUTPUT.PUT_LINE(v_id||' 사원 입사일은 '||v_hiredate||' 근속연수는 '||trunc(months_between(sysdate, v_hiredate)/12)||'년입니다.');
--    dbms_output.put(v_sal);
--    dbms_output.new_line;
    dbms_output.put_line(v_id||' 사원의 급여가 '||v_sal||' -> '||(v_sal*1.1)||' 수정했습니다.');
    
END;
/

 

코드의 간결화)

SELECT hire_date, salary
FROM hr.employees
WHERE employee_id = 100;

# 근속연수가 20년이상이면
trunc(months_between(sysdate, hire_date)/12)

UPDATE hr.employees
SET salary = salay*1.1
WHERE employee_id = 100;

SELECT salary
FROM hr.employees
WHERE employee_id = 100;

PL/SQL  코드로 작성

DECLARE
    v_id hr.employees.employee_id%TYPE := 100;
    v_day hr.employees.hire_date%TYPE;
    v_years number := trunc(months_between(sysdate, v_day)/12);
    v_sal_before hr.employees.salary%TYPE;
    v_sal_after hr.employees.salary%TYPE;
BEGIN
    SELECT hire_date, salary
    INTO v_day, v_sal_before
    FROM hr.employees
    WHERE employee_id = v_id;
    
    v_years := trunc(months_between(sysdate, v_day)/12);
    DBMS_OUTPUT.PUT_LINE(v_id||' 사원 입사일은 '||v_day||' 근속연수는 '||v_years||'년입니다.');        
    
    IF v_years >= 20 THEN -- 20년 이상 IF문
        UPDATE hr.employees
        SET salary = salary*1.1
        WHERE employee_id = v_id;
       
        IF sql%found THEN -- sql%found IF문
            -- ture 이면 
            SELECT salary
            INTO v_sal_after
            FROM hr.employees
            WHERE employee_id = v_id;
            
            DBMS_OUTPUT.PUT_LINE(v_id||' 사원의 급여가 '||v_sal_before||' → '||v_sal_after||' 수정했습니다.');
            COMMIT;
        ELSE
            ROLLBACK;
        END IF; -- sql%found IF-END
        
    ELSE
        DBMS_OUTPUT.PUT_LINE(v_id||'사원은 급여를 수정할 수 없습니다.');
    END IF; -- 20년 이상 IF-END
    
END;
/
728x90
반응형
LIST

'문제 > SQL' 카테고리의 다른 글

231030 PL/SQL 복습 겸 문제  (1) 2023.10.30
231030 PL/SQL 복습  (0) 2023.10.30
231026 PL/SQL 복습 겸 문제  (1) 2023.10.26
231024 Oracle SQL 실기 TEST's 오답노트  (0) 2023.10.24
231024 Oracle SQL 필기 TEST's 오답노트  (0) 2023.10.24