ORACLE PACKAGE 包详解

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