PL/SQL 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;                               --代码得到工资
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值