본문 바로가기

DB/Oracle

[Oracle] 패키지(Package)

패키지(Pacakage)란 '꾸러미' 라는 사전적인 의미가 있다. 패키지는 업무와 관련된 Stored Procedure 및 Stored Function을 관리하고, 이를 패키지 단위로 배포할 때 유용하게 사용된다.

 

패키지 선언부는 SP, SF, Public변수, 커서 및 예외절의 선언등을 포함할 수 있다. 패키지 선언부에 선언된 모든 요소들의 적용 범위는 패키지 전체에 해당된다.

 

-- 패키지 선언부

CREATE OR REPLACE PACKAGE emp_pack IS
PROCUDURE empno;
PROCUDURE emp_salary;
END emp_pack

-- 패키지 본문

CREATE OR REPLACE PACKAGE BODY emp_pack
IS
      PROCEDURE empno
      IS
      BEGIN
      
      Statement;



      End empno;



      PROCEDURE emp_salary

      IS

              

      BEGIN

      Statement;



      END emp_salary;



END emp_pack



EXEC emp_pack.emp_salary;

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------앞서 생성한 SP info_salary 와 tax()함수를 패키지에 포함해보기

 

CREATE OR REPLACE PACKAGE emp_pack
IS

     PROCEDURE info_salary (p_empid employees.employee_id%TYPE);
     FUNCTION tax (p_sal IN employees.salary%TYPE, p_bonus employees.commission_pct%TYPE)
     
     RETURN NUMBER;

END emp_pack;

CREATE OR REPLACE PACKAGE BODY emp_pack
IS

     -- SP info_salary 구현 부분
     
     PROCEDURE info_salary (p_empid employees.employee_id%TYPE)
     IS

               l_empname employees.last_name%TYPE;
               l_sal employees.salary%TYPE;
               l_rank CHAR(1);
               l_tax NUMBER;
               
     BEGIN

              SELECT last_name, salary,
                             CASE WHEN salary < 1000 THEN 'C'
                             WHEN salary BETWEEN 1000 AND 2000 THEN 'B'
                             WHEN salary > 2000 THEN 'A'
                             END CASE,
                             
                            tax(salary, commission_pct)

              INTO l_empname, l_sal, l_rank, l_tax
              FROM employees
              WHERE employee_id = p_empid;

             DBMS_OUTPUT.PUT_LINE (p_empid || ' ' || l_empname || ' ' || l_sal || ' ' || l_rank || ' ' || l_tax);

     END info_salary;

     -- 사용자 정의 함수 tax 의 구현부분

     FUNCTION tax (p_sal IN employees.salary%TYPE, p_bonus employees. commission_pct%TYPE)
     RETURN NUMBER
     IS
     
            l_sum NUMBER;
            l_tax NUMBER;
            
     BEGIN

           l_sum := p_sal + NVL(p_bonus, 0) * 100
           
           IF l_sum < 1000 THEN l_tax := l_sum * 0.05;
           ELSIF l_sum < 2000 THEN l_tax := l_sum * 0.1;
           ELSE l_tax := l_sum * 0.2;

           END IF;

          RETURN (l_tax);

    END tax;

END emp_pack;

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

만든 패키지 다른 사용자에게 선물하기

 

GRANT EXECUTE ON emp_pack TO scott;

 

테스트

CONN scott

SET SERVEROUTPUT ON;

EXEC hr.emp_pack.info_salary(146)

CONN scott

SET SERVEROUTPUT ON;
EXEC hr.emp_pack.info_salary(146)

 

권한 회수하기

 

REVOKE EXECUTE ON emp_pack FROM scott;