database/oracle

Procedure, Function, Package

labj 2012. 3. 22. 00:23

 

 

 

* 실습개요
- 사원의 급여를 조정하는 프로시저를 생성한다.
- 사원의 연봉을 구하는 Function을 생성한다.
- 사원의 퇴직급여를 구하는 Function을 생성한다.
- 사원정보를 삭제하는 Procedure를 생성한다.
- 사원의 입사일자를 구하는 Function을 생성한다.
- 개발자를 위해 각 Procedure, Function의 사용법을 알려주는 Function을 생성한다.
- 관련된 Procedure 및 Function 들을 Package로 묶는다.

 

 

* 사원급여 조정 Procedure
CREATE OR REPLACE PROCEDURE scott.adjust_sal (v_flag VARCHAR2, v_empno NUMBER, v_pct NUMBER) AS
BEGIN
 IF v_flag='INCREASE' THEN
  UPDATE emp SET sal=sal+(sal*(v_pct/100))
  WHERE empno = v_empno;
 ELSE
  UPDATE emp SET sal=sal-(sal*(v_pct/100))
  WHERE empno = v_empno;
 END IF;
END;

 

 


* 사원의 연봉을 구하는 Function
CREATE OR REPLACE FUNCTION scott.get_annual_sal (v_empno NUMBER)
 RETURN NUMBER IS v_sal NUMBER;
BEGIN
 SELECT (sal+NVL(comm,0)) * 12 INTO v_sal
 FROM emp WHERE empno=v_empno;
 RETURN v_sal;
END;

 

 

 

* 사원의 퇴직급여를 구하는 Function
CREATE OR REPLACE FUNCTION scott.get_retire_money (v_empno NUMBER)
 RETURN NUMBER IS v_sal NUMBER;
BEGIN
 SELECT ROUND((sal*NVL(comm,0)) * ROUND(MONTHS_BETWEEN(sysdate, hiredate),0)/12,0)
 INTO v_sal FROM emp WHERE empno=v_empno;
 RETURN v_sal;
END;

 

 


* 사원정보를 삭제하는 Procedure
CREATE OR REPLACE PROCEDURE scott.remove_emp (v_empno NUMBER) AS
BEGIN 
 DELETE FROM emp WHERE empno=v_empno;
END;

* 사원의 입사일자를 구하는 Function
CREATE OR REPLACE FUNCTION scott.get_hiredate (v_empno NUMBER, v_fmt VARCHAR2)
 RETURN VARCHAR2 IS v_hiredate VARCHAR2(20);
BEGIN
 SELECT TO_CHAR(hiredate, v_fmt)
 INTO v_hiredate FROM emp WHERE empno = v_empno;
 RETURN v_hiredate;
END;

 

 

 


* Procedure 실행
SQL> EXEC adjust_sal('INCREASE', 7369, 10);

* Function 실행
SQL>  SELECT empno "사번", ename "성명",  get_annual_sal(empno) "연봉", get_retire_money(empno) "퇴직금"
 FROM emp
 WHERE deptno = 30;

 

 


* 개발자를 위한 Help Function 생성
CREATE OR REPLACE FUNCTION scott.help ( v_module VARCHAR2)
 RETURN VARCHAR2 IS v_usage VARCHAR2(100);
BEGIN
 v_usage := v_module || '는(은) 등록되지 않은 모듈입니다.';
 IF UPPER(v_module) = 'ADJUST_SAL' THEN
  v_usage := 'TYPE : PROC, Usage : ADJUST_SAL(INCREASE|DECREASE, 사번, 증감율)';
 ELSIF UPPER(v_module) = 'GET_ADJUST_SAL' THEN
  v_usage := 'TYPE : FUNC, Usage  : GET_ADJUST_SAL(사번)';
 ELSIF UPPER(v_module) = 'GET_RETIRE_SAL' THEN
  v_usage := 'TYPE : FUNC, Usage : GET_RETIRE_MONEY(사번)';
 ELSIF UPPER(v_module) = 'REMOVE_EMP' THEN
  v_usage := 'TYPE : PROC, Usage : REMOVE_EMP(사번)';
 ELSIF UPPER(v_module) = 'GET_HIREDATE' THEN
  v_usage := 'TYPE : PROC, Usage : GET_HIREDATE(사번, 날짜포맷)';
 END IF;
 RETURN v_usage;
END;

 

 

 






SELECT HELP('GET_HIREDATE') FROM DUAL; 

 

 

 

* Package 생성
CREATE OR REPLACE PACKAGE emp_mgmt AS
 PROCEDURE adjust_sal (v_flag VARCHAR2, v_empno NUMBER, v_pct NUMBER) ;
 FUNCTION get_annual_sal (v_empno NUMBER) RETURN NUMBER;
 FUNCTION get_retire_money (v_empno NUMBER) RETURN NUMBER;
 PROCEDURE remove_emp (v_empno NUMBER);
 FUNCTION get_hiredate (v_empno NUMBER, v_fmt VARCHAR2) RETURN VARCHAR2;
END emp_mgmt;

* Package BODY 생성
CREATE OR REPLACE PACKAGE BODY emp_mgmt AS
 PROCEDURE adjust_sal (v_flag VARCHAR2, v_empno NUMBER, v_pct NUMBER) IS
 BEGIN
  IF v_flag='INCREASE' THEN
   UPDATE emp SET sal=sal+(sal*(v_pct/100))
   WHERE empno = v_empno;
  ELSE
   UPDATE emp SET sal=sal-(sal*(v_pct/100))
   WHERE empno = v_empno;
  END IF;
 END;

 -- 연봉계산
 FUNCTION get_annual_sal (v_empno NUMBER)
  RETURN NUMBER IS v_sal NUMBER;
 BEGIN
  SELECT (sal+NVL(comm,0)) * 12 INTO v_sal
  FROM emp WHERE empno=v_empno;
  RETURN v_sal;
 END;

 -- 퇴직급여 계산
 FUNCTION get_retire_money (v_empno NUMBER)
  RETURN NUMBER IS v_money NUMBER;
 BEGIN
  SELECT ROUND((sal*NVL(comm,0)) * ROUND(MONTHS_BETWEEN(sysdate, hiredate),0)/12,0)
  INTO v_money FROM emp WHERE empno=v_empno;
  RETURN v_money;
 END; 
 -- 사원 정보 삭제
 PROCEDURE remove_emp (v_empno NUMBER) IS
 BEGIN 
  DELETE FROM emp WHERE empno=v_empno;
 END;

 -- 입사일 구하기
 FUNCTION get_hiredate (v_empno NUMBER, v_fmt VARCHAR2)
  RETURN VARCHAR2 IS v_hiredate VARCHAR2(20);
 BEGIN
  SELECT TO_CHAR(hiredate, v_fmt)
  INTO v_hiredate FROM emp WHERE empno = v_empno;
  RETURN v_hiredate;
 END;
END emp_mgmt;

 

 

 


* Package 실행
SQL> EXEC emp_mgmt.adjust_sal('INCREASE', 7369, 10); 

 

SQL> SELECT emp_mgmt.get_hiredate(7369, 'yyyy-mm-dd hh24:mi:ss') FROM dual; 

* Package 관련 Dictionary
SQL>
SELECT name, type, line, text
FROM user_source
WHERE name = 'ADJUST_SAL'
ORDER BY line;

SQL>
SELECT object_name, object_type, created, timestamp FROM user_objects;

 

'database > oracle' 카테고리의 다른 글

오라클 데이터 Export  (0) 2012.03.22
오라클 설치 후 삭제  (0) 2012.03.22
Procedure, Function & Package 개념  (0) 2012.03.22
Database Event Trigger  (0) 2012.03.22
DDL Trigger  (0) 2012.03.22