包是由存储在一起的相关对象组成的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中的部分。对包进行初始化的逻辑都可以写到这里。