oracle10g 包

  1. 包package
  2. 包是一组相关过程、函数、变量、常量、类型和游标等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,
  3. 是对这些PL/SQL程序设计元素的封装。一个包由两个分开的部分组成:
  4. (1)包package声明或定义:包定义部分是创建包的规范说明,声明包内数据类型、变量、常量、游标等元素。
  5. 这部分也是为使用者提供了透明的接口。
  6. (2)包体packpage boyd:包体是包定义部分的具体实现。
  7. (3)将有联系的对象打成包,方便使用
  8. (4)包中对象包括储存过程,函数,游标,自定义类型和变量,可以在PL_SQL块中应用这些对象.
  9. 定义包头:
  10. ----------------------------------------------------------------------------------------------
  11. create or replace package <Package_name> is
  12.   type <TypeName> is <Datatype>;--定义类型
  13.   -- Public constant declarations
  14.   <ConstantName> constant <Datatype> := <Value>;--声明常量
  15.   -- Public variable declarations
  16.   <VariableName> <Datatype>;  --数据类型
  17.   -- Public function and procedure declarations
  18.   function <FunctionName>(<Parameter> <Datatype>) return <Datatype>; --函数
  19. end <Package_name>;
  20. 定义包体:
  21. ----------------------------------------------------------------------------------------------
  22. create or replace package body <Package_name> is
  23.   -- Private type declarations
  24.   type <TypeName> is <Datatype>;
  25.   -- Private constant declarations
  26.   <ConstantName> constant <Datatype> := <Value>
  27.   -- Private variable declarations
  28.   <VariableName> <Datatype>;
  29.   -- Function and procedure implementations
  30.   function <FunctionName>(<Parameter> <Datatype>) return <Datatype> is --函数的具体内容
  31.     <LocalVariable> <Datatype>;
  32.   begin
  33.     <Statement>;
  34.     return(<Result>);
  35.   end;
  36. begin
  37.   -- Initialization--初始化包体,每次调用时被初始化
  38.   <Statement>;
  39. end <Package_name>;
  40. 只有当包头编辑成功后才能编辑包体.其中的函数名与过程名须和包头中的函数过程一样.
  41. 1 包说明和包体必须有相同的名字
  42. 2 包的开始没有begin语句,与存储过程和函数不同。
  43. 3 在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。
  44. 4 在包内声明常量、变量、类型定义、异常、及游标时不使用declare。
  45. 5 包内的过程和函数的定义不要create or replace语句。
  46. 6 包声明和包体两者分离。
  47. 包头(Package)与包体(Package body)的应用
  48. 包的作用: 根据出生年月返回年龄function Getage,返回工资function Getsalary
  49. --创建环境
  50. Create Table T_PsnSalary  --工资表
  51. (
  52. Fpsncode varchar(4) default '',  --个人代码
  53. Fpsndesc varchar(20) default '',  --描述
  54. FpsnBirth varchar(20) default '', --生日
  55. FpsnSalary number(8,2)            --工资
  56. );
  57. --添加数据
  58. Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C001','张三','1986.01.10',1100);
  59. Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C002','李四','1980.10.10',3000);
  60. Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C003','王五','1996.12.10',800);
  61. commit;
  62. --创建包头
  63. create or replace package package_demo is
  64.   function Getage(birthst varchar,birthend varchar) return integer;
  65.   function Getsalary(VFpsncode varchar) return number;
  66. end package_demo;
  67. --创建包体
  68. create or replace package body package_demo is
  69.   function Getage(birthst varchar,birthend varchar) return integer --得到年龄函数
  70.   is
  71.      V_birth integer;
  72.      ToDateEnd Date;
  73.      Toyear number(4);
  74.      Tomonth number(4);
  75.      Fromyear number(4);
  76.      Frommonth number(4);
  77.   begin
  78.     if (birthend='') or (birthend is null) then
  79.     select sysdate into ToDateEnd from dual; --得到系统时间
  80.     end if;
  81.     Toyear := to_number(to_char(ToDateEnd,'YYYY')); --得到最后年月
  82.     Tomonth := to_number(to_char(ToDateEnd,'MM'));
  83.     Fromyear := to_number(substr(birthst,1,4));--计算的年月
  84.     Frommonth := to_number(substr(birthst,6,2));
  85.     if Tomonth-Frommonth>0 then V_birth:=Toyear-fromyear;
  86.     else V_birth:=Toyear-fromyear-1;
  87.     end if;
  88.     return(V_birth);
  89.   end Getage;
  90.   function getSalary(VFpsncode varchar) return number--返回工资情况
  91.   is
  92.     V_psnSalary number(8,2);
  93.   begin
  94.     Select FpsnSalary into V_psnSalary from T_PsnSalary  where Fpsncode=VFpsncode;
  95.     return(V_psnSalary);
  96.   end getSalary;
  97.   
  98. end package_demo;
  99. select a.*,package_demo.Getage(Fpsnbirth,'')age from T_psnsalary a;  --调用包得到年龄功能
  100. select package_demo.getsalary('C001') from dual;                     --代码得到工资
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值