​PL/SQL 包Package

​包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;begininsert 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;beginselect 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);beginselect 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;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值