- ORACLE 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; --代码得到工资
ORACLE PACKAGE 包详解
最新推荐文章于 2025-02-19 08:29:45 发布