ORACLE PACKAGE 包 详解

包是一组相关过程、函数、变量、常量#SinaEditor_Temp_FontName、类型和游标等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/SQL程序设计元素的封装。一个包由两个分开的部分组成:

 
(1)包package声明或定义:包定义部分是创建包的规范说明,声明包内数据类型、变量、常量、游标等元素。
 
这部分也是为使用者提供了透明的接口。
 
(2)包体packpage body:包体是包定义部分的具体实现。
 
(3)将有联系的对象打成包,方便使用
 
(4)包中对象包括储存过程,函数,游标,自定义类型和变量,可以在PL_SQL块中应用这些对象.
 
定义包头:
 
----------------------------------------------------------------------------------------------
 
create or replace package< Package_name> is
 
  type< TypeName> is< Datatype>;--定义类型
 
  -- Public constant declarations
 
 < ConstantName> constant< Datatype> :=< Value>;--声明常量
 
  -- Public variable declarations
 
 < VariableName>< Datatype>;  --数据类型
 
  -- Public function and procedure declarations
 
  function< FunctionName>(<Parameter>< Datatype>) return< Datatype>; --函数
 
end <Package_name>;
 
定义包体:
 
----------------------------------------------------------------------------------------------
 
create or replace package body< Package_name> 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;
 
begin
 
  -- Initialization--初始化包体,每次调用时被初始化
 
 < Statement>;
 
end <Package_name>;
 
只有当包头编辑成功后才能编辑包体.其中的函数名与过程名须和包头中的函数过程一样.
 
1 包说明和包体必须有相同的名字
 
2 包的开始没有begin语句,与存储过程和函数不同。
 
3 在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。
 
4 在包内声明常量、变量、类型定义、异常、及游标时不使用declare。
 
5 包内的过程和函数的定义不要create or replace语句。
 
6 包声明和包体两者分离。
 
包头(Package)与包体(Package body)的应用
 
包的作用: 根据出生年月返回年龄function Getage,返回工资function Getsalary
 
--创建环境
 
Create Table T_PsnSalary  --工资表
 
(
 
Fpsncode varchar(4) default '',  --个人代码
 
Fpsndesc varchar(20) default '',  --描述
 
FpsnBirth varchar(20) default '', --生日
 
FpsnSalary number(8,2)            --工资
 
);
 
--添加数据
 
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C001','张三','1986.01.10',1100);
 
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C002','李四','1980.10.10',3000);
 
Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C003','王五','1996.12.10',800);
 
commit;
 
--创建包头
 
create or replace package package_demo is
 
 function Getage(birthst varchar,birthend varchar) return integer;
 
 function Getsalary(VFpsncode varchar) return number;
 
end package_demo;
 
--创建包体
 
create or replace package body package_demo is
 
  function Getage(birthst varchar,birthend varchar) return integer --得到年龄函数
 
  is
 
     V_birth integer;
 
     ToDateEnd Date;
 
     Toyear number(4);
 
     Tomonth number(4);
 
     Fromyear number(4);
 
     Frommonth number(4);
 
  begin
 
   if (birthend='') or (birthend is null) then 
 
    select sysdate into ToDateEnd from dual; --得到系统时间
 
    end if;
 
    Toyear := to_number(to_char(ToDateEnd,'YYYY')); --得到最后年月
 
    Tomonth := to_number(to_char(ToDateEnd,'MM'));
 
    Fromyear := to_number(substr(birthst,1,4));--计算的年月
 
    Frommonth := to_number(substr(birthst,6,2));
 
    if Tomonth-Frommonth>0 then V_birth:=Toyear-fromyear;
 
    else V_birth:=Toyear-fromyear-1;
 
    end if;
 
    return(V_birth);
 
  end Getage;
 
  function getSalary(VFpsncode varchar) return number--返回工资情况
 
  is
 
    V_psnSalary number(8,2);
 
  begin
 
    Select FpsnSalary into V_psnSalary from T_PsnSalary  where Fpsncode=VFpsncode;
 
    return(V_psnSalary);
 
  end getSalary;  
 
end package_demo;
 
select a.*,package_demo.Getage(Fpsnbirth,'')age from T_psnsalary a;  --调用包得到年龄功能
 
select package_demo.getsalary('C001') from dual;                     --代码得到工资
posted @ 2018-01-31 15:17  一片番薯叶  阅读(727)  评论(0)    收藏  举报