패키지의 이점

  • 종속성 체인을 끊어준다. 패키지는 연속적인 무효화의 효과를 줄이거나 없앤다.
  • 명칭 공간을 증가시킨다. 하나의 패키지는 다수의 프로시져를 포함할 수 있다.
    따라서 프로시져/함수별로 사전객체가 존재하지 않고
    패키지라고 하는 하나의 데이터사전 객체만 존재한다.
  • 다중 정의를 지원한다. 하나의 패키지는 동일한 이름의 프로시져를 다수 보유할 수 있다.
  • 캡슐화를 지원한다. 화면 크기에 맞춰라 - 패키지 밖에서는 최소한의 로직만 구현
  • 세션 지속형 변수를 지원한다.
  • 개시 코드를 지원한다.
  • 관련된 기능을 묶을 수 있도록 해준다.


종속성 체인 끊기

패키지 미사용 예제


CREATE TABLE t(x INT);

CREATE VIEW v AS SELECT * FROM t;

CREATE PROCEDURE p
AS
BEGIN
    FOR x IN (SELECT * FROM v)
    LOOP
        NULL;
    END LOOP;
END;
/

CREATE OR REPLACE FUNCTION f
RETURN NUMBER
AS
    l_cnt NUMBER;
BEGIN
    SELECT COUNT(*) INTO l_cnt FROM t;
    RETURN l_cnt;
END;
/


SELECT name, type, referenced_name, referenced_type
  FROM user_dependencies
 WHERE referenced_owner = user
 ORDER BY name
;

NAME TYPE       REFERENCED_NAME REFERENCED_TYPE
---- ---------- --------------- ---------------
F    FUNCTION   T               TABLE          
P    PROCEDURE  V               VIEW           
V    VIEW       T               TABLE          


SELECT object_name, object_type, status
  FROM user_objects
;

OBJECT_NAME OBJECT_TYPE STATUS
----------- ----------- -------
F           FUNCTION    VALID  
P           PROCEDURE   VALID  
T           TABLE       VALID  
V           VIEW        VALID  


ALTER TABLE t ADD y NUMBER;

SELECT object_name, object_type, status
  FROM user_objects
;

OBJECT_NAME OBJECT_TYPE STATUS
----------- ----------- -------
F           FUNCTION    INVALID
P           PROCEDURE   INVALID
T           TABLE       VALID  
V           VIEW        INVALID


CREATE PROCEDURE p2
AS
BEGIN
    p;
END;
/

SELECT name, type, referenced_name, referenced_type
  FROM user_dependencies
 WHERE referenced_owner = user
 ORDER BY name
;

NAME TYPE       REFERENCED_NAME REFERENCED_TYPE
---- ---------- --------------- ---------------
F    FUNCTION   T               TABLE          
P    PROCEDURE  V               VIEW           
P2   PROCEDURE  P               PROCEDURE      
V    VIEW       T               TABLE          


SELECT object_name, object_type, status
  FROM user_objects
;

OBJECT_NAME OBJECT_TYPE STATUS
----------- ----------- -------
F           FUNCTION    INVALID
P           PROCEDURE   VALID
P2          PROCEDURE   VALID
T           TABLE       VALID
V           VIEW        VALID


ALTER TABLE t ADD z NUMBER;

SELECT object_name, object_type, status
  FROM user_objects
;

OBJECT_NAME OBJECT_TYPE STATUS
----------- ----------- -------
F           FUNCTION    INVALID
P           PROCEDURE   INVALID
P2          PROCEDURE   INVALID
T           TABLE       VALID  
V           VIEW        INVALID

패키지 사용 예제


DROP PROCEDURE p;

DROP PROCEDURE p2;

DROP FUNCTION f;


CREATE PACKAGE p1
AS
    PROCEDURE p;
END;
/

CREATE PACKAGE BODY p1
AS
    PROCEDURE p
    AS
    BEGIN
        FOR x IN (SELECT * FROM v)
        LOOP
            NULL;
        END LOOP;
    END;
END p1;
/

CREATE PACKAGE p2
AS
    PROCEDURE p;
END;
/

CREATE PACKAGE BODY p2
AS
    PROCEDURE p
    AS
    BEGIN
        p1.p;
    END;
END p2;
/


SELECT name, type, referenced_name, referenced_type
  FROM user_dependencies
 WHERE referenced_owner = user
 ORDER BY name
;

NAME TYPE         REFERENCED_NAME REFERENCED_TYPE
---- ------------ --------------- ---------------
P1   PACKAGE BODY V               VIEW
P1   PACKAGE BODY P1              PACKAGE
P2   PACKAGE BODY P2              PACKAGE
P2   PACKAGE BODY P1              PACKAGE
V    VIEW         T               TABLE


SELECT object_name, object_type, status
  FROM user_objects
;

OBJECT_NAME OBJECT_TYPE  STATUS
----------- ------------ -------
P1          PACKAGE      VALID
P1          PACKAGE BODY VALID
P2          PACKAGE      VALID
P2          PACKAGE BODY VALID
T           TABLE        VALID
V           VIEW         VALID

ALTER TABLE t ADD a NUMBER;

SELECT object_name, object_type, status
  FROM user_objects
;

OBJECT_NAME OBJECT_TYPE  STATUS
----------- ------------ -------
P1          PACKAGE      VALID
P1          PACKAGE BODY INVALID
P2          PACKAGE      VALID
P2          PACKAGE BODY VALID
T           TABLE        VALID
V           VIEW         INVALID


EXEC p2.p;

SELECT object_name, object_type, status
  FROM user_objects
;

OBJECT_NAME OBJECT_TYPE  STATUS
----------- ------------ -------
P1          PACKAGE      VALID
P1          PACKAGE BODY VALID
P2          PACKAGE      VALID
P2          PACKAGE BODY VALID
T           TABLE        VALID
V           VIEW         VALID


패키지 요약

  • 모든 프로덕션 품질의 코드에는 데이터베이스 패키지를 사용해야 한다.
  • 패키지는 캡슐화와 명칭 공간 축소와 같은 프로그래밍 구조물을 제공한다.
  • 패키지는 종속성 체인을 끊음으로써 데이터베이스 스키마의 변화가 전체 스키마
    또는 심지어 데이터베이스가 무효상태로 변화되지 않게 한다.
    따라서 비싼 재컴파일 비용을 줄여준다.
  • 자립형 함수와 프로시져는 언제 필요한가?
    • 간단한 기능 시연 및 테스트에 사용될 수 있다.
    • 시스템의 모든 "실제 코드"에는 유일하게 패키지만 사용해야 한다.
  • 자립형 유틸리티 예시
    • SHOW_SPACE 스크립트 객체가 사용하고 있는 공간을 보여준다.
    • PRINT_TABLE 유틸리티 SQL*Plus에서 결과집합을 페이지의 상하로 인쇄한다.
    • DUMP_CSV 프로시져(PL/SQL) 쿼리를 취하여 값이 컴마로 분리된 파일을 만든다.