加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ORACLE PACKAGE 包详解

发布时间:2020-12-12 14:27:12 所属栏目:百科 来源:网络整理
导读:ORACLEPACKAGE包详解 包是一组相关过程、函数、变量、常量#SinaEditor_Temp_FontName、类型和游标等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/SQL程序设计元素的封装。一个包由两个分开的部分组成: (1)包package声明或定义:包定义
  1. ORACLEPACKAGE包详解
  2. 包是一组相关过程、函数、变量、常量#SinaEditor_Temp_FontName、类型和游标等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/SQL程序设计元素的封装。一个包由两个分开的部分组成:
  3. (1)包package声明或定义:包定义部分是创建包的规范说明,声明包内数据类型、变量、常量、游标等元素。这部分也是为使用者提供了透明的接口。
  4. (2)包体packpagebody:包体是包定义部分的具体实现。
  5. (3)将有联系的对象打成包,方便使用
  6. (4)包中对象包括储存过程,函数,游标,自定义类型和变量,可以在PL_SQL块中应用这些对象.
  7. 定义包头:
  8. ----------------------------------------------------------------------------------------------
  9. createorreplacepackage<Package_name>is
  10. typeTypeName>isDatatype>;--定义类型
  11. --Publicconstantdeclarations
  12. ConstantName>constant>:=Value>;--声明常量
  13. --Publicvariabledeclarations
  14. VariableName>>;--数据类型
  15. --Publicfunctionandproceduredeclarations
  16. functionFunctionName>(Parameter>)return>;--函数
  17. end>;
  18. 定义包体:
  19. createorreplacepackagebody --Privatetypedeclarations
  20. type --Privateconstantdeclarations
  21. >
  22. --Privatevariabledeclarations
  23. --Functionandprocedureimplementations
  24. function>is--函数的具体内容
  25. LocalVariable>;
  26. begin
  27. Statement return(Result>);
  28. end;
  29. --Initialization--初始化包体,每次调用时被初始化
  30. end
  31. 只有当包头编辑成功后才能编辑包体.其中的函数名与过程名须和包头中的函数过程一样.
  32. 1包说明和包体必须有相同的名字
  33. 2包的开始没有begin语句,与存储过程和函数不同。
  34. 3在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。
  35. 4在包内声明常量、变量、类型定义、异常、及游标时不使用declare。
  36. 5包内的过程和函数的定义不要createorreplace语句。
  37. 6包声明和包体两者分离。
  38. 包头(Package)与包体(Packagebody)的应用
  39. 包的作用:根据出生年月返回年龄functionGetage,返回工资functionGetsalary
  40. --创建环境
  41. CreateTableT_PsnSalary--工资表
  42. (
  43. Fpsncodevarchar(4)default'',--个人代码
  44. Fpsndescvarchar(20)default'',--描述
  45. FpsnBirthvarchar(20)default'',--生日
  46. FpsnSalarynumber(8,2)--工资
  47. );
  48. --添加数据
  49. InsertintoT_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary)Values('C001','张三','1986.01.10',1100);
  50. InsertintoT_PsnSalary(Fpsncode,FpsnSalary)Values('C002','李四','1980.10.10',3000);
  51. commit;
  52. --创建包头
  53. createorreplacepackagepackage_demois
  54. functionGetage(birthstvarchar,birthendvarchar)returninteger;
  55. functionGetsalary(VFpsncodevarchar)returnnumber;
  56. endpackage_demo;
  57. --创建包体
  58. createorreplacepackagebodypackage_demois
  59. is
  60. V_birthinteger;
  61. ToDateEndDate;
  62. Toyearnumber(4);
  63. Tomonthnumber(4);
  64. Fromyearnumber(4);
  65. Frommonthnumber(4);
  66. if(birthend='')or(birthendisnull)then
  67. selectsysdateintoToDateEndfromdual;--得到系统时间
  68. endif;
  69. Toyear:=to_number(to_char(ToDateEnd,'YYYY'));--得到最后年月
  70. Tomonth:=to_number(to_char(ToDateEnd,'MM'));
  71. Fromyear:=to_number(substr(birthst,1,4));--计算的年月
  72. Frommonth:=to_number(substr(birthst,6,2));
  73. ifTomonth-Frommonth>0then
  74. V_birth:=Toyear-fromyear;
  75. else
  76. V_birth:=Toyear-fromyear-1;
  77. endif;
  78. return(V_birth);
  79. endGetage;
  80. functiongetSalary(VFpsncodevarchar)returnnumber--返回工资情况
  81. V_psnSalarynumber(8,2);
  82. begin
  83. SelectFpsnSalaryintoV_psnSalaryfromT_PsnSalarywhereFpsncode=VFpsncode;
  84. return(V_psnSalary);
  85. endgetSalary;
  86. endpackage_demo;
  87. selecta.*,package_demo.Getage(Fpsnbirth,'')agefromT_psnsalarya;--调用包得到年龄功能
  88. selectpackage_demo.getsalary('C001')fromdual;--代码得到工资

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读