본문 바로가기

Database/Oracle Work

PL// work 07

/*
예제1) 
EVEN_ODD(
    ID:NUMBER(4) 
    GUBUN:VARCHAR2(10)
) 
테이블을 작성하고 START숫자와 END숫자를 입력 받아 그 사이의 숫자를 ID에 저장하고  
ID의 숫자가 짝수이면 GUBUN에 “짝수”를 홀수이면 GUBUN에 “홀수”라고 입력하는 
SCRIPT를 WHILE문으로 작성하여라.

예) 
START : 1,  END : 10 입력 ->  10개의 ROW가 된다.
*/

CREATE TABLE EVEN_ODD(
    ID NUMBER(4), 
    GUBUN VARCHAR2(10)
);

SET SERVEROUTPUT ON
ACCEPT p_start PROMPT 'start 숫자'
ACCEPT p_end PROMPT 'end 숫자'

DECLARE
    v_start NUMBER(4) := &p_start;
    v_end NUMBER(4) := &p_end;
BEGIN
    IF v_start > v_end THEN
        dbms_output.put_line('start가 end보다 큽니다');
    ELSE
        
        WHILE v_start <= v_end LOOP
            IF MOD(v_start, 2) = 0 THEN
                INSERT INTO even_odd(id, gubun)
                VALUES(v_start, '짝수');
            ELSE
                INSERT INTO even_odd(id, gubun)
                VALUES(v_start, '홀수');
            END IF;
            v_start := v_start + 1;
        END LOOP;      
        
        SYS.dbms_output.put_line(&p_start || '로부터 ' || &p_end || '까지 ' ||
                    TO_CHAR(&p_end - &p_start + 1) || '개의 자료가 입력되었습니다');        
    END IF;
END;
/

SELECT * FROM even_odd;



-- 예제2)사원번호를 입력 받으면 다음과 같이 출력되는 PROCEDURE를 작성하라
-- Purchasing 부서명의 사원입니다
CREATE PROCEDURE getDeptName(empno IN NUMBER, dname OUT VARCHAR2)
IS    
BEGIN
    SELECT d.department_name INTO dname
    FROM employees e, departments d
    WHERE e.department_id = d.department_id
        AND e.employee_id = empno;
END;
/

VAR dname VARCHAR2;
EXEC getdeptname(100, :dname);
PRINT dname;

-- 예제3)사원번호를 입력받고, 
-- 소속부서의 최고, 최저연봉 차액을 파라미터로 출력하는 PROCEDURE를 작성하라.
CREATE OR REPLACE PROCEDURE emp_deptTopMoney(empno IN NUMBER, diff OUT NUMBER)
IS
    deptno employees.department_id%TYPE;
BEGIN
    -- 입력된 사원의 부서 조사
    SELECT department_id into deptno
    FROM employees
    WHERE employee_id = empno;
    
    -- 최고, 최소의 차액
    SELECT (MAX(salary) - MIN(salary)) INTO diff
    FROM employees
    WHERE department_id = deptno;
END;
/
/*
SELECT MAX(salary), MIN(salary)
FROM employees
WHERE department_id = 50;

SELECT (MAX(salary) - MIN(salary))
FROM employees
WHERE department_id = 50;
*/
VAR di NUMBER;
ACCEPT p_empno PROMPT '사원번호'
EXEC emp_depttopmoney(&p_empno, :di);
PRINT di;

-- function(SCOTT)
-- 1) 두 숫자를 제공하면 덧셈을 해서 결과값을 반환하는 함수를 정의하시오.(함수명 add_num)
CREATE FUNCTION add_num(num1 INTEGER, num2 INTEGER)
    RETURN INTEGER
IS
BEGIN
    RETURN (num1 + num2);
END;
/

SELECT add_num(12, 34)
FROM DUAL;

/*
2) 부서번호를 입력하면 해당 부서에서 근무하는 사원 수를 반환하는 함수를 정의하시오.
   (함수명 get_emp_count)
*/
CREATE FUNCTION get_emp_count(dept_no IN NUMBER)
    RETURN NUMBER
IS
    v_count NUMBER;
BEGIN
    SELECT COUNT(*) INTO v_count
    FROM emp
    WHERE deptno = dept_no
    GROUP BY deptno;
    
    RETURN v_count;
END;
/

VAR count NUMBER;
EXEC :count := get_emp_count(10);
PRINT count;




-- 3) emp테이블을 이용해서 입사일을 제공하면 근무연차를 구하는 함수를 정의하시오.
-- (소수점 자리 절삭, 함수명 get_info_hiredate)
CREATE FUNCTION get_info_hiredate(hire_date emp.hiredate%TYPE)
    RETURN NUMBER
IS
    v_year NUMBER;
BEGIN
    v_year := trunc( MONTHS_BETWEEN(sysdate, hire_date) / 12 );
    RETURN v_year;
END;
/

-- select MONTHS_BETWEEN(sysdate, '19/01/23') / 12
-- from dual;

SELECT ename, get_info_hiredate(hiredate) AS "근무연차"
FROM emp;




-- 4) emp테이블을 이용해서 사원번호를 입력하면 해당 사원의 관리자 이름을 구하는 함수를
--   정의하시오.(함수명 get_mgr_name)
CREATE FUNCTION get_mgr_name(emp_no INTEGER) 
    RETURN VARCHAR2
IS
    mgrname VARCHAR2(20);
BEGIN
    SELECT b.ename INTO mgrname
    FROM emp a, emp b
    WHERE a.mgr = b.empno
        AND a.empno = emp_no;
        
    RETURN mgrname;
END;
/

SELECT ename, get_mgr_name(empno) AS "관리자명" 
FROM emp;

/*



5) emp테이블을 이용해서 사원번호를 입력하면 
급여 등급을 구하는 함수를 정의하시오.
4000~5000 A, 
3000~4000미만 B, 
2000~3000미만 C, 
1000~200미만 D, 
1000미만 F,
 함수명 get_sal_grade)
*/
drop FUNCTION get_sal_grade;

CREATE FUNCTION get_sal_grade(emp_no emp.empno%TYPE)
    RETURN VARCHAR2
IS
    sgrade CHAR(1);
BEGIN
    SELECT
        CASE WHEN sal >= 4000 AND sal <= 5000 THEN 'A'
            WHEN sal >= 3000 AND sal < 4000 THEN 'B'
            WHEN sal >= 2000 AND sal < 3000 THEN 'C'
            WHEN sal >= 1000 AND sal < 2000 THEN 'D'
            ELSE 'F'
        END INTO sgrade 
    FROM emp
    WHERE empno = emp_no;
    
    RETURN sgrade;
END;
/

SELECT ename, sal, get_sal_grade(empno) AS "급여등급"
FROM emp;

'Database > Oracle Work' 카테고리의 다른 글

update  (0) 2020.11.11
제품, 고객, 판매 연습을 위한 테이블 생성  (0) 2020.11.09
입력받아 EMP테이블에 자료를 등록, 시퀀스, 조건문  (0) 2020.06.29
work 05  (0) 2020.06.26
work 04  (0) 2020.06.26