包可將一些有聯絡的對象放在其內部。任何能在塊定義部分出現的對象都可以在包中出現。這些對象包括儲存過程,函數,遊標,自訂類型(例如PLSQL表和記錄)和變數。我們在其他的PLSQL塊中引用包中的這些對象,也就是說,包為PLSQL提供了全域變數.
一不包由兩個獨立部分組成---包頭和包體。
定義一個包,要分別定義包頭和包體。
eg
CREATE OR REPLACE PACKAGE AuthsPack AS
PROCEDURE QuerySalary
(
p_code auths.author_code%TYPE,
P_sALARY OUT auths.salary%TYPE
);
PROCEDURE InsertAuthor
(
p_Code auths.author_code%TYPE,
p_Name auths.name%TYPE,
p_Sex auths.sex%TYPE,
p_Birthdate auths.birthdate%TYPE,
p_entry_date_time auths.entry_datetime%TYPE
);
END AuthsPack;
AuthsPack包中有兩個預存程序,QueueSalary用來查詢指定作家的工資,InsertAuthor用來向AUTHS表插入記錄.
定義包體:
CREATE OR REPLACE PACKAGE BODY AuthsPack IS
PROCEDURE QuerySalary(
p_code auths.author_code%TYPE,
p_Salary OUT auths.salary%TYPE
)
AS
BEGIN
SELECT salary into p_Salary FROM auths WHERE author_code = p_code;
END QuerySalary;
PROCEDURE InsertAuthor
(
p_Code auths.author_code%TYPE,
p_Name auths.name%TYPE,
p_Sex auths.sex%TYPE,
p_Birthday auths.birthday%TYPE,
p_entry_date_time auths.entry_date_time%TYPE
)
AS
BEGIN
INSERT INTO ...;
END InsertAuthor;
END AuthsPack;
在包中定義的任意對象都可以在保外使用,只是在引用該對象前用包名做首碼。
在包的內部,預存程序和函數可被重載,這意味著有多個儲存過程或函數可以使用同一個名稱,但是參數不能相同。這樣允許不同的參數調用同意個名字的過程或函數.