包Package
包(PACKAGE)的全称叫程序包,是由一组相关的函数,过程,变量,游标等PL/SQL程序设计元素的组合。
包类似于java中的类,把公有的变量,常量,函数,过程等都封装到该包中.
说其像java中的类,其实更像java中的接口,因为包是包含两部分:
–包接口规范:相当于java中定义了一个接口,封装公有的属性,抽象方法.
–包体:相当于实现类,将抽象方法的方法体进行实体化.
包接口规范语法:
CREATE [OR REPLACE] PACKAGE package_name
IS|AS
[公有数据类型定义]
[公有游标声明]
[公有变量、常量声明]
[公有函数声明]
[公有过程声明]
END [package_name];
包体语法:
CREATE [OR REPLACE] PACKAGE BODY package_name
IS|AS
[私有数据类型定义]
[私有变量、常量声明]
[私有异常错误声明]
[私有函数声明和定义]
[私有函过程声明和定义]
[公有游标定义]
[公有函数定义]
[公有过程定义]
BEGIN
--执行部分
END package_name;
执行调用包:
BEGIN
package_name.函数名/过程名(有参传参);
END;
案例:
准备数据:create table emp12 as select * from emp where 1=1;
–声明一个包接口,定义关于emp12包的返回新插入员工的编号的函数,查询指定员工信息的存储过程,返回某部门全年薪资支出存储过程
第一步:先写包规范:
create or replace package emp12_msg
as
deptid emp12.deptno%type:=30;
function quarynewempid(eno emp12.empno%type, ena emp12.ename%type,
ejob emp12.job%type, emgr emp12.mgr%type,
ehir emp12.hiredate%type,esal emp12.sal%type,
ecomm emp12.comm%type,edno emp12.deptno%type)
return number;
procedure empmsg(eno emp12.empno%type);
procedure deptyearsal(dno emp12.deptno%type);
end;
第二步:写包体
create or replace package body emp12_msg
as
--返回新插入员工的编号的函数
function quarynewempid(eno emp12.empno%type,ena emp12.ename%type,
ejob emp12.job%type, emgr emp12.mgr%type,
ehir emp12.hiredate%type,esal emp12.sal%type,
ecomm emp12.comm%type,edno emp12.deptno%type)
return number
as
newempno emp12.empno%type;
begin
insert into emp12 values(eno,ena,ejob,emgr,ehir,esal,ecomm,edno);
select empno into newempno from emp12 where ename=ena;
return newempno;
end quarynewempid;
–查询指定员工信息的存储过程
procedure empmsg(eno emp12.empno%type)
as
xemp emp12%rowtype;
begin
select empno,ename,sal into xemp.empno,xemp.ename,xemp.sal from emp12
where empno=eno;
dbms_output.put_line('编号:'||xemp.empno||',名字:'||xemp.ename||',工资:'||xemp.sal);
end empmsg;
--返回某部门全年薪资支出存储过程
procedure deptyearsal(dno emp12.deptno%type)
as
yearcomm emp12.comm%type;
yearsal emp12.sal%type;
sumsalcomm number(10);
begin
select sum(sal),sum(NVL(comm,0)) into yearsal,yearcomm from emp12
where deptno=dno;
sumsalcomm:=yearsal*12+yearcomm*12;
dbms_output.put_line(dno||'号部门,全年薪资支出为:'||sumsalcomm||'元');
end deptyearsal;
end;
第三步:调用
declare
resu number;
begin
--调用全局变量
dbms_output.put_line(emp12_msg.deptid);
--返回新插入员工的编号的函数
resu:=emp12_msg.quarynewempid(1001,'jack','临时工',7369,
to_date('2018-4-19','yyyy-mm-dd'),5000,3000,70);
dbms_output.put_line(resu);
--查询指定员工信息的存储过程
emp12_msg.empmsg(7369);
--返回某部门全年薪资支出存储过程
emp12_msg.deptyearsal(emp12_msg.deptid);
end;