前端之家收集整理的这篇文章主要介绍了
ORACLE PACKAGE 包详解,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
- ORACLEPACKAGE包详解
-
- 包是一组相关过程、函数、变量、常量#SinaEditor_Temp_FontName、类型和游标等PL/sql程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/sql程序设计元素的封装。一个包由两个分开的部分组成:
- (1)包package声明或定义:包定义部分是创建包的规范说明,声明包内数据类型、变量、常量、游标等元素。这部分也是为使用者提供了透明的接口。
- (2)包体packpagebody:包体是包定义部分的具体实现。
- (3)将有联系的对象打成包,方便使用
- (4)包中对象包括储存过程,函数,游标,自定义类型和变量,可以在PL_sql块中应用这些对象.
- 定义包头:
- ----------------------------------------------------------------------------------------------
- createorreplacepackage<Package_name>is
- typeTypeName>isDatatype>;--定义类型
- --Publicconstantdeclarations
- ConstantName>constant>:=Value>;--声明常量
- --Publicvariabledeclarations
- VariableName>>;--数据类型
- --Publicfunctionandproceduredeclarations
- functionFunctionName>(Parameter>)return>;--函数
- end>;
- 定义包体:
- createorreplacepackagebody --Privatetypedeclarations
- type --Privateconstantdeclarations
- >
- --Privatevariabledeclarations
- --Functionandprocedureimplementations
- function>is--函数的具体内容
- LocalVariable>;
- begin
- Statement return(Result>);
- end;
- --Initialization--初始化包体,每次调用时被初始化
- end
- 只有当包头编辑成功后才能编辑包体.其中的函数名与过程名须和包头中的函数过程一样.
- 1包说明和包体必须有相同的名字
- 2包的开始没有begin语句,与存储过程和函数不同。
- 3在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。
- 4在包内声明常量、变量、类型定义、异常、及游标时不使用declare。
- 5包内的过程和函数的定义不要createorreplace语句。
- 6包声明和包体两者分离。
- 包头(Package)与包体(Packagebody)的应用
- 包的作用:根据出生年月返回年龄functionGetage,返回工资functionGetsalary
- --创建环境
- CreateTableT_PsnSalary--工资表
- (
- Fpsncodevarchar(4)default'',--个人代码
- Fpsndescvarchar(20)default'',--描述
- FpsnBirthvarchar(20)default'',--生日
- FpsnSalarynumber(8,2)--工资
- );
- --添加数据
- InsertintoT_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary)Values('C001','张三','1986.01.10',1100);
- InsertintoT_PsnSalary(Fpsncode,FpsnSalary)Values('C002','李四','1980.10.10',3000);
- commit;
- --创建包头
- createorreplacepackagepackage_demois
- functionGetage(birthstvarchar,birthendvarchar)returninteger;
- functionGetsalary(VFpsncodevarchar)returnnumber;
- endpackage_demo;
- --创建包体
- createorreplacepackagebodypackage_demois
- 函数
- is
- V_birthinteger;
- ToDateEndDate;
- Toyearnumber(4);
- Tomonthnumber(4);
- Fromyearnumber(4);
- Frommonthnumber(4);
- if(birthend='')or(birthendisnull)then
- selectsysdateintoToDateEndfromdual;--得到系统时间
- endif;
- 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));
- ifTomonth-Frommonth>0then
- V_birth:=Toyear-fromyear;
- else
- V_birth:=Toyear-fromyear-1;
- endif;
- return(V_birth);
- endGetage;
- functiongetSalary(VFpsncodevarchar)returnnumber--返回工资情况
- V_psnSalarynumber(8,2);
- begin
- SelectFpsnSalaryintoV_psnSalaryfromT_PsnSalarywhereFpsncode=VFpsncode;
- return(V_psnSalary);
- endgetSalary;
- endpackage_demo;
- selecta.*,package_demo.Getage(Fpsnbirth,'')agefromT_psnsalarya;--调用包得到年龄功能
- selectpackage_demo.getsalary('C001')fromdual;--代码得到工资
原文链接:https://www.f2er.com/oracle/207647.html