1.定义:包用于逻辑组合相关的PL/SQL类型,项和子程序,由包规范和包体组成
建立包规范:包规范是包与应用程序之间的接口,用于定义包的公用组件,
包括常量,变量,游标,过程,函数等
建立包体:用于实现包规范所定义的过程和函数
2.语法:
包规范只定义不实现
create [or replace] package pkg_name
is
变量;
过程;
函数;
end pkg_name;
包体实现包规范中的定义
create [or replace] package body pkg_name
is
过程;
函数;
end pkg_name;

3.举例:
包规范
create or replace package pkg_emp
is
v_deptno number(3):=30;
procedure add_employee(p_eno number,p_ename varchar2,p_sal number,
p_dno number default v_deptno);
procedure del_employee(eno number);
function get_sal(eno number) return number;
end pkg_emp;
/
show err;
包体
create or replace package body pkg_emp
is
--校验部门号是否有效
function validate_deptno(v_deptno number) return boolean
is
v_cnt number;
begin
select count(1) into v_cnt from dept where deptno=v_deptno;
if v_cnt=1 then
return true;
else
return false;
end if;
end;
--增加职员
procedure add_employee(p_eno number,p_ename varchar2,p_sal number,
p_dno number default v_deptno)
is
begin
if validate_deptno(p_dno) then
insert into emp(empno,ename,sal,deptno) values(p_eno,p_ename,p_sal,p_dno);
else
raise_application_error(-20001,'不存在该部门');
end if;
end;
--删除职员
procedure del_employee(eno number) is
begin
delete from emp where empno=eno;
if sql%notfound then
raise_application_error(-20012,'该雇员不存在');
end if;
end;
--获取工资
function get_sal(eno number) return number
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=eno;
return v_sal;
end;
end pkg_emp;
/
show err;

4.调用包组件
4.1调用包公用变量
exec pkg_emp.v_deptno:=20

begin
--pkg_emp.v_deptno:=20;
dbms_output.put_line(pkg_emp.v_deptno);
end;
4.2调用包公用过程
exec pkg_emp.add_employee(1112,'mary',2000);
exec pkg_emp.del_employee(1112);

begin
pkg_emp.add_employee(1112,'mary',2000);
--pkg_emp.del_employee(1112);
end;
4.3调用包公用函数
var salary number
exec :salary:=pkg_emp.get_sal(7788)

declare
v_sal number;
begin
v_sal:=pkg_emp.get_sal(7788);
--select pkg_emp.get_sal(7788) into v_sal from dual;
dbms_output.put_line('v_sal='||v_sal);
end;
4.4 包的私有过程、函数不能被外部调用(只能被包的过程、函数调用)
如:function validate_deptno(v_deptno number) return boolean
可以在add_employee内调用,但不能如下被调用。
declare
v_bool boolean;
begin
v_bool:=pkg_emp.validate_deptno(10);
dbms_output.put_line('v_bool='||v_bool);
end;
4.5以其他用户身份调用包公用组件
connect to sys/123 as sysdba;
exec scott.pkg_emp.add_employee(1115,'scott',1200);
exec scott.pkg_emp.del_employee(1115);
4.6调用远程数据库包的公用组件
exec emp_package.add_employee@orasrv(1116,'scott',1200)
需要创建db_link

5.查看源代码:存放在数据字典USER_SCOURCE中
select text from user_source where lower(name)='pkg_emp';
6.删除包
drop package pkg_emp;

7.使用包重载
重载(overload)是指多个具有相同名称的子程序。
包中的函数、过程允许同名,但参数个数、参数类型不能完全相同。
参数名、、返回值
create or replace package pkg_emp_overload is
function get_sal(eno number) return number;
function get_sal(eno varchar2) return number;
end pkg_emp_overload;
/
show err;
7.1建立包规范
create or replace package pkg_emp_overload is
function get_sal(eno number) return number;
function get_sal(name varchar2) return number;
procedure del_employee(eno number);
procedure del_employee(name varchar2);
end pkg_emp_overload;
/
show err;

7.2建立包体
必须要给不同的重载过程和重载函数提供不同的实现代码
create or replace package body pkg_emp_overload is
function get_sal(eno number) return number
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=eno;
return v_sal;
exception
when no_data_found then
raise_application_error(-20020,'该雇员不存在');
end;

function get_sal(name varchar2) return number
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where upper(ename)=upper(name);
return v_sal;
exception
when no_data_found then
raise_application_error(-20020,'该雇员不存在');
end;

procedure del_employee(eno number) is
begin
delete from emp where empno=eno;
if sql%notfound then
raise_application_error(-20020,'该雇员不存在');
end if;
end;

procedure del_employee(name varchar2) is
begin
delete from emp where upper(ename)=upper(name);
if sql%notfound then
raise_application_error(-20020,'该雇员不存在');
end if;
end;
end pkg_emp_overload;
/
show err;

7.3 调用重载过程和重载函数
var sal1 number;
var sal2 number;
exec :sal1:=pkg_emp_overload.get_sal('scott');
exec :sal2:=pkg_emp_overload.get_sal(7685);
exec pkg_emp_overload.del_employee(7369);
exec pkg_emp_overload.del_employee('scott');

8.使用包构造过程
包构造过程用于给包变量赋值。
包的构造过程没有任何名称,它是实现了包的其他过程后,
以BEGIN开始,END结束的部分,
在包体中给包变量赋值。
8.1建立包规范
--包的构造过程用于初始化包的全局变量.
在包规范中定义包变量。
create or replace package pkg_emp_construction is
minsal number(6,2);
maxsal number(6,2);
procedure add_employee(eno number,name varchar2,
salary number,dno number);
procedure upd_sal(eno number,salary number);
procedure upd_sal(name varchar2,salary number);
end pkg_emp_construction;
/
show err;

8.2 建立包体
包的构造过程没有任何名称,它是实现了包的其他过程后,
以BEGIN开始,END结束的部分,
在包体中给包变量赋值。
create or replace package body pkg_emp_construction
is
procedure add_employee(eno number,name varchar2,salary number,dno number)
is
begin
if salary between minsal and maxsal then
insert into emp (empno,ename,sal,deptno) values(eno,name,salary,dno);
else
raise_application_error(-20001,'工资不在范围内');
end if;
exception
when dup_val_on_index then
raise_application_error(-20002,'该雇员已经存在');
end;

procedure upd_sal(eno number,salary number) is
begin
if salary between minsal and maxsal then
update emp set sal=salary where empno =eno;
if sql%notfound then
raise_application_error(-20003,'不存在雇员号');
end if;
else
raise_application_error(-20001,'工资不在范围内');
end if;
end;

procedure upd_sal(name varchar2,salary number) is
begin
if salary between minsal and maxsal then
update emp set sal=salary where upper(ename)=upper(name);
if sql%notfound then
raise_application_error(-20004,'不存在该雇员名');
end if;
else
raise_application_error(-20001,'工资不在范围内');
end if;
end;
begin
select min(sal),max(sal) into minsal,maxsal from emp ;
end pkg_emp_construction;
/
show err;
8.3 调用包公用组件:构造过程只调用一次
exec pkg_emp_construction.add_employee(1117,'mary',3000,20);

begin
dbms_output.put_line('minsal='||pkg_emp_construction.minsal);
dbms_output.put_line('maxsal='||pkg_emp_construction.maxsal);
end;

exec pkg_emp_construction.upd_sal('mary',2000);

--只定义包规范
create or replace package pkg_var is
minsal number(6,2);
maxsal number(6,2);
end pkg_var;
/
show err;

9.作业
9.1 针对dept表做一个包
包括新增部门、修改部门、删除部门,
包括返回部门名、返回loc。

9.2 将转账业务改造成包,要求如下:
包括三个过程 转入、转出、记日志(私有过程);
包括两个函数(参数为账户) 转入金额、转出金额。
并编写单独的过程调用包进行转入、转出操作;
通过sql调用函数,输出 转入金额、转出金额。

Oracle_PL/SQL(5) 包的更多相关文章

  1. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  2. PL/SQL之--包

    一.包 包是一组相关过程.函数.常量.变量.游标.异常等PL/SQL程序设计元素的组合.它类似于C++和Java中的类,其中变量相当于类中的成员变量,过程和函数相当于类中的方法.通过使用包,可以使开发 ...

  3. Oracle_PL/SQL(9) 例外处理

    例外处理1.例外分类:预定义例外,非预定义例外,自定义例外三种传递例外:如果在例外处理部分exception没有捕捉例外,oracle会将例外传递到调用环境.捕捉并处理例外:使用例外处理部分完成exc ...

  4. Oracle_PL/SQL(4) 过程和函数

    create table s_sc ( SNAME VARCHAR2(20) primary key, c_grade NUMBER(6), m_grade NUMBER(6), e_grade NU ...

  5. Oracle_PL/SQL(3) 游标

    引言:PLSQL数据类型标量数据类型:数字类.字符类.日期类.布尔类(boolean).复合数据类型:记录(%rowtype).表.数组引用类型:REF CURSORLOB类型:BLOB.CLOB 1 ...

  6. Oracle_PL/SQL(1) 匿名块

    1. PL/SQL 简介PL/SQL是一种比较复杂的程序设计语言, 用于从各种环境中访问Oracle数据库.为什么使用PL/SQL?Orade是一种关系型数据库, 用来访问关系型数据库的语言是 “结构 ...

  7. PL/SQL之包

    1.包的定义 一个包由两个独立的部分组成--包头和包体.给部分被单独地存放在数据字典中. .1定义包头 语法: CREATE [OR REPLACE] PACKAGE [schema.] packag ...

  8. PL/SQL编程—包

    1.PLSQL 中的包就相当于java中的package,主要好处有(1)防止命名污染,(2)功能统一,(3)允许重载,(4)可以隐藏核心代码,(5)最重要的就是断开依赖链. 2.对于一个程序需要大量 ...

  9. Oracle_PL/SQL(10) 定时器job

    定时器job1.定义 定时器指在特定的时间执行特定的操作. 可以多次执行.说明:特定的操作:指一个完成特定功能的存储过程.多次执行:指可以每分钟.每小时.每天.每周.每月.每季度.每年等周期性的运行. ...

随机推荐

  1. Structs复习 访问web元素

    Structs帮我们在action和http里建立了联系 主要有四种方式 我们主要用第二种(IOC 依赖容器注入 ) Jar包 web.XML <?xml version="1.0&q ...

  2. canvas入门笔记

    1.Canvas的使用注意  A.要在页面中添加一对canvas标记,默认占300*150的区域  B.我们可以通过html属性‘width’,‘height’来设置canvas的宽高,不可以通过cs ...

  3. (Unity4.7)assetbundle 坑爹总结

    使用版本Unity4.7 一.关于依赖打包 1.当一个被打包的资源A引用了其他的资源B,并且没有被打成一个包时,要选用[BuildAssetBundleOptions.CollectDependenc ...

  4. 无法加载ISAPI 筛选器 当前配置只支持加载为 AMD64 处理器体系结构创建的映像

    无法加载ISAPI 筛选器 当前配置只支持加载为 AMD64 处理器体系结构创建的映像 2011-11-9 0:18:49来源:本站原创作者:清晨320我要评论(0) 今天服务器的伪静态死活加载不上去 ...

  5. zabbix 监控端口

    监控HTTPD端口的shell #!/bin/bash #2019年4月19日18:: ####### httpd=` netstat -tnlp|grep httpd|awk '{print $4} ...

  6. NYOJ44-子串和-(dp||思维)

    题目描述: 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入描述: 第一行是一个整 ...

  7. Django 基础教程中的Django表单

    在 urls.py 中对应写上这个函数,教程中给的Django 1.7x以下的,我的时2.0.7,应该为 from django.contrib import admin from django.ur ...

  8. 04_web基础(二)之web构建

    03.04.05.06web项目创建 07.第一个Servlet程序 1.拷贝tomcat 中的 servlet-api.jar 在lib包下面 2.新建一个HelloWordServlet类并实现 ...

  9. msf客户端渗透(八):持久后门,mimikatz使用,获取PHP服务器shell

    持续后门 先获取一个session 在目标主机上生成持续后门 设置侦听参数 启动侦听 重新启动被攻击的主机 一启动攻击者时获取到session mimikatz的使用 mimikatz是俄罗斯组织开发 ...

  10. day11 闭包函数和装饰器

    1.函数不是新知识点 主要是学习函数的用法 在面向对象编程中,一切皆对象,函数也不例外 具体的表现 1.函数可以引用 2.函数可以作为函数的参数 3.函数可以作为函数的返回值 4.可以被存储到容器类型 ...