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