使用Package的優點在於提供了必需的程式設計結構, 促進了模組化編程設計, 最重要的是Package斷開了依賴鏈, 使得對某個資料庫模式的改動不會導致整個模式的無效,從而避免了昂貴的重編譯!
例如: 存在table t , procedure p1 p2, view v, function f, 它們之間參考關聯性如下:
select name,type,referenced_name,referenced_type from user_dependencies
where referenced_owner='SCOTT'
order by name;F FUNCTION T TABLE
P1 PROCEDURE V VIEW P2 PROCEDURE P1 PROCEDURE
V VIEW T TABLE
當alter table t add y number時, 依賴於t的所有對象(包括傳遞依賴的對象, 即p1依賴於t, p2依賴於p1)就全部無效, 需要重新編譯(如果代碼很複雜, 就會有較大的消耗)
select user_objects.object_name,user_objects.object_type,user_objects.status from user_objectsF FUNCTION INVALID
P1 PROCEDURE INVALID P2 PROCEDURE INVALID
T TABLE VALID
V VIEW INVALID
如果使用程式包之後table t , package pkg1,pkg2, view v, 可以發現PACKAGE BODY是依賴於PACKAGE, 而PKG2依賴於PKG1的PACKAGE, 而不是PACKAGE BODY
select name,type,referenced_name,referenced_type from user_dependencies
where referenced_owner='SCOTT'
order by name;PKG1 PACKAGE BODY V VIEW PKG1 PACKAGE BODY PKG1 PACKAGE PKG2 PACKAGE BODY PKG2 PACKAGE PKG2 PACKAGE BODY PKG1 PACKAGE V VIEW T TABLE
當alter table t add y number時,會發現PK1的PACKAGE BODY會無效, 但是PKG2的PACKAGE BODY是有效
select user_objects.object_name,user_objects.object_type,user_objects.status from user_objects P1 PACKAGE BODY INVALID P2 PACKAGE BODY VALID P1 PACKAGE VALID
P2 PACKAGE VALID
T TABLE VALID
V VIEW INVALID