包是由存儲在一起的相關對象組成的PL/SQL結構。包有兩個獨立的部分,即包頭和包體,這兩部分獨立地存儲在數據字典中。包允許相關的對象結為組,并且效率比較高。
從本質上講,包就是一個命名的聲明部分。任何可以出現在塊聲明中的語句都可以在包中使用,這些語句包括過程,函數,游標,類型以及變量。把上述內容放入包中的好處是我們可以從其他PL/SQL塊中對其進行引用,因此包為PL/SQL提供了全局變量。
包頭包含了有關包內容的信息。然而,該部分中不包括包的代碼部分:
create or replace package <PackageName> is
-- Author : ADMINISTRATOR
-- Created : 2013-4-10 15:28:44
-- Purpose :
-- Public type declarations
type < TypeName >
< Datatype >;
-- Public constant declarations
< ConstantName > constant < Datatype > := < Value >;
-- Public variable declarations
< VariableName > < Datatype >;
-- Public function and procedure declarations
function < FunctionName > (< Parameter > < Datatype >) return < Datatype >;
procedure < ProcedureName > (< Parameter > < Datatype >);
end <PackageName>;
包體是一個獨立于包頭的數據字典對象。包體只能在包頭完成編譯后才能進行編譯。包體中帶有實現包頭中描述的前向子程序的代碼段。除此之外,包體還可以包括具有包體全局屬性的附加聲明部分,但這些附加說明對于包頭和外部是不可見的。
create or replace package body <PackageName> is
-- Private type declarations
type < TypeName > is
< Datatype >;
-- Private constant declarations
< ConstantName > constant < Datatype > := < Value >;
-- Private variable declarations
< VariableName > < Datatype >;
-- Function and procedure implementations
function < FunctionName > (< Parameter > < Datatype >) return < Datatype > is
< LocalVariable > < Datatype >;
begin
< Statement >;
return(< Result >);
end;
procedure < ProcedureName > (< Parameter > < Datatype >) is
< LocalVariable > < Datatype >;
begin
< Statement >;
end;
begin
-- Initialization
< Statement >;
end;
包體是可選的。如果包頭中沒有說明任何過程或函數的話(只有變量聲明,游標,類型等),則該包體就不必存在。
包頭中的任何前向說明不能出現在包體中。包頭和包體中的過程和函數的說明必須一致,其中包括子程序名和其參數名,以及參數的模式。
包頭中聲明的任何對象都是在其作用域中,并且可在其外部使用包名作為前綴對其進行引用。但是只在包體中聲明函數和過程為包體的全局量,其作用域是包體本身。他們可以由該包中的其他過程調用,但是在包體外是不可見的。
包的初始化:當第一次調用打包子程序時,該包將進行初始化。也就是說將該包從硬盤中讀入到內存并啟動調用的子程序的編譯代碼開始運行。這時,系統為該包中定義的所有變量分配內存單元。每個會話都有其打包變量的副本,以確保執行同一包子程序的兩個對話使用不同的內存單元。
在大多數情況下,初始化代碼要在包第一次初始化時運行。為了實現這種功能,我們可以在包體中所有對象之后加入一個初始化部分,這部分就是上面包體最后面的Initialization中的部分。對包進行初始化的邏輯都可以寫到這里。