본문 바로가기
Be Smart/SQL

[오라클] PL/SQL 패키지: 이해와 활용 방법

by 반월하 2024. 7. 3.
728x90


PL/SQL 패키지: 이해와 활용 방법

패키지(package)는 PL/SQL 서브 프로그램을 하나의 논리 그룹으로 묶어 통합, 관리하는 객체입니다. 이는 업무나 기능 면에서 연관성이 높은 프로시저, 함수 등의 여러 PL/SQL 서브 프로그램을 포함합니다. 패키지를 사용하면 서브 프로그램을 그룹화하여 관리할 수 있으며, 이는 프로그램의 사용성과 성능을 크게 향상시킵니다. 이번 포스팅에서는 패키지의 구조와 생성, 장점, 사용 방법 등에 대해 알아보겠습니다.

패키지의 장점

1. 모듈성

패키지는 서브 프로그램을 포함한 여러 PL/SQL 구성 요소를 모듈화하여 프로그램의 이해를 쉽게 하고, 패키지 사이의 상호 작용을 간편하고 명료하게 해줍니다.

2. 쉬운 응용 프로그램 설계

패키지에 포함할 서브 프로그램은 완벽하게 완성되지 않아도 정의가 가능하므로, 전체 소스 코드를 다 작성하기 전에 미리 패키지에 저장할 서브 프로그램을 지정할 수 있습니다.

3. 정보 은닉

패키지에 포함된 서브 프로그램의 외부 노출 여부를 지정할 수 있어, 보안을 강화할 수 있습니다.

4. 기능성 향상

패키지 내부에서는 서브 프로그램 외에도 변수, 커서, 예외 등을 공용으로 사용할 수 있습니다.

5. 성능 향상

패키지에 포함된 모든 서브 프로그램이 메모리에 한 번에 로딩되며, 메모리에 로딩된 후의 호출은 디스크 I/O를 일으키지 않으므로 성능이 향상됩니다.

패키지 구조와 생성

패키지는 보통 두 부분으로 나누어 제작합니다: 명세(specification)본문(body).

패키지 명세

패키지 명세는 변수, 상수, 예외, 커서, 그리고 서브 프로그램을 선언하는 용도로 작성합니다. 패키지 명세 기본 형식은 다음과 같습니다:

CREATE [OR REPLACE] PACKAGE 패키지 이름
IS | AS
    서브프로그램을 포함한 다양한 객체 선언
END [패키지 이름];

예를 들어, 다음은 변수 한 개, 함수 한 개, 프로시저 두 개를 선언하는 패키지 명세입니다:

CREATE OR REPLACE PACKAGE pkg_example
IS
   spec_no NUMBER := 10;
   FUNCTION func_aftertax(sal NUMBER) RETURN NUMBER;
   PROCEDURE pro_emp(in_empno IN EMP.EMPNO%TYPE);
   PROCEDURE pro_dept(in_deptno IN DEPT.DEPTNO%TYPE);
END;
/

패키지 본문

패키지 본문에는 패키지 명세에서 선언한 서브 프로그램 코드를 작성합니다. 패키지 본문 기본 형식은 다음과 같습니다:

CREATE [OR REPLACE] PACKAGE BODY 패키지 이름
IS | AS
    패키지 명세에서 선언한 서브 프로그램을 포함한 여러 객체를 정의
END [패키지 이름];

다음은 패키지 본문 예시입니다:

CREATE OR REPLACE PACKAGE BODY pkg_example
IS
   body_no NUMBER := 10;

   FUNCTION func_aftertax(sal NUMBER) RETURN NUMBER
      IS
         tax NUMBER := 0.05;
      BEGIN
         RETURN (ROUND(sal - (sal * tax)));
   END func_aftertax;

   PROCEDURE pro_emp(in_empno IN EMP.EMPNO%TYPE)
      IS
         out_ename EMP.ENAME%TYPE;
         out_sal EMP.SAL%TYPE;
      BEGIN
         SELECT ENAME, SAL INTO out_ename, out_sal
           FROM EMP
          WHERE EMPNO = in_empno;

         DBMS_OUTPUT.PUT_LINE('ENAME : ' || out_ename);
         DBMS_OUTPUT.PUT_LINE('SAL : ' || out_sal);
   END pro_emp;

   PROCEDURE pro_dept(in_deptno IN DEPT.DEPTNO%TYPE)
      IS
         out_dname DEPT.DNAME%TYPE;
         out_loc DEPT.LOC%TYPE;
      BEGIN
         SELECT DNAME, LOC INTO out_dname, out_loc
           FROM DEPT
          WHERE DEPTNO = in_deptno;

         DBMS_OUTPUT.PUT_LINE('DNAME : ' || out_dname);
         DBMS_OUTPUT.PUT_LINE('LOC : ' || out_loc);
   END pro_dept;
END;
/

서브프로그램 오버로드

서브프로그램 오버로드는 같은 패키지에서 사용하는 파라미터의 개수, 자료형, 순서가 다를 경우에 한해서만 이름이 같은 서브 프로그램을 정의하는 것입니다. 예를 들어, 다음과 같이 프로시저를 오버로드할 수 있습니다:

CREATE OR REPLACE PACKAGE pkg_overload
IS
   PROCEDURE pro_emp(in_empno IN EMP.EMPNO%TYPE);
   PROCEDURE pro_emp(in_ename IN EMP.ENAME%TYPE);
END;
/

패키지 본문에서 오버로드된 프로시저를 작성하는 예시는 다음과 같습니다:

CREATE OR REPLACE PACKAGE BODY pkg_overload
IS
   PROCEDURE pro_emp(in_empno IN EMP.EMPNO%TYPE)
      IS
         out_ename EMP.ENAME%TYPE;
         out_sal EMP.SAL%TYPE;
      BEGIN
         SELECT ENAME, SAL INTO out_ename, out_sal
           FROM EMP
          WHERE EMPNO = in_empno;

         DBMS_OUTPUT.PUT_LINE('ENAME : ' || out_ename);
         DBMS_OUTPUT.PUT_LINE('SAL : ' || out_sal);
      END pro_emp;

   PROCEDURE pro_emp(in_ename IN EMP.ENAME%TYPE)
      IS
         out_ename EMP.ENAME%TYPE;
         out_sal EMP.SAL%TYPE;
      BEGIN
         SELECT ENAME, SAL INTO out_ename, out_sal
           FROM EMP
          WHERE ENAME = in_ename;

         DBMS_OUTPUT.PUT_LINE('ENAME : ' || out_ename);
         DBMS_OUTPUT.PUT_LINE('SAL : ' || out_sal);
      END pro_emp;

END;
/

패키지 사용하기

패키지에 포함된 서브 프로그램을 실행하려면 다음과 같이 사용할 수 있습니다:

BEGIN
   DBMS_OUTPUT.PUT_LINE('--pkg_example.func_aftertax(3000)--');
   DBMS_OUTPUT.PUT_LINE('after-tax:' || pkg_example.func_aftertax(3000));

   DBMS_OUTPUT.PUT_LINE('--pkg_example.pro_emp(7788)--');
   pkg_example.pro_emp(7788);

   DBMS_OUTPUT.PUT_LINE('--pkg_example.pro_dept(10)--' );
   pkg_example.pro_dept(10);

   DBMS_OUTPUT.PUT_LINE('--pkg_overload.pro_emp(778 
728x90

댓글