本文简单介绍包, 目前来看我用的不多, 除了之前 为了实现 一个procedure 的输出参数是结果集的时候用到过 package.

概念: 包是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合。

特点: 它具有面向对象程序设计语言的特点,是对PL/SQL程序设计元素(过程、函数、变量等)的封装。它使程序设计模块化。

包中的程序元素分为两种:公用元素(公用组件)、私用元素(私用组件).

组成: 一个包由两个分开的部分组成

(1) 包规范(包定义):用于定义包的公用组件,包括常量、变量、游标、过程和函数等。

(2) 包体(包主体):用于实现包规范所定义的公用过程和函数。

包体不仅可用于实现公用过程和函数,而且还可以定义包的私有组件(变量、游标、过程、函数等)

创建包规范语法

CREATE [OR REPLACE] PACKAGE package_name
IS | AS
-- 定义公用常量、变量、游标、过程、函数等
END [package_name];

实例1:

CREATE OR REPLACE PACKAGE emp_package
IS
--添加员工信息的存储过程
PROCEDURE add_emp_proc
(v_empno IN emp.empno%TYPE,
v_ename IN emp.ename%TYPE,
v_sal IN emp.sal%TYPE,
v_deptno IN emp.deptno%TYPE); --删除员工信息的存储过程
PROCEDURE del_emp_proc (v_empno IN emp.empno%TYPE);
END emp_package;

创建包体的语法

CREATE [OR REPLACE] PACKAGE BODY package_name
IS | AS
--定义私有常量、变量、游标、过程和函数等
--实现公用过程和函数
END [package_name];

调用包:  包名.元素名称

删除包: DROP PACKAGE [BODY] [user.] package_name;

实例2:

CREATE OR REPLACE PACKAGE BODY emp_package
IS
--添加员工信息的存储过程
PROCEDURE add_emp_proc
(v_empno IN emp.empno%TYPE,
v_ename IN emp.ename%TYPE,
v_sal IN emp.sal%TYPE,
v_deptno IN emp.deptno%TYPE)
IS
e_2291 EXCEPTION;
PRAGMA EXCEPTION_INIT(e_2291, -2291);
BEGIN
INSERT INTO emp(empno, ename, sal, deptno)
VALUES(v_empno, v_ename, v_sal, v_deptno);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20001, '员工号不能重复');
WHEN e_2291 THEN
RAISE_APPLICATION_ERROR(-20002, '部门号不存在');
END; --删除员工信息的存储过程
PROCEDURE del_emp_proc
(v_empno IN emp.empno%TYPE)
IS
BEGIN
--根据员工号删除指定的员工信息
DELETE FROM emp WHERE empno = v_empno;
--判断是否删除成功
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20009, '指定删除的员工不存在');
ELSE
DBMS_OUTPUT.PUT_line('删除成功');
END IF;
END;
END emp_package;

调用上述包-->员工信息存储过程

DECLARE
v_empno emp.empno%TYPE := &empno;
v_ename emp.ename%TYPE := '&name';
v_sal emp.sal%TYPE := &salary;
v_deptno emp.deptno%TYPE := &deptno;
e_dup_val EXCEPTION;
e_no_dept EXCEPTION; PRAGMA EXCEPTION_INIT(e_dup_val, -20001);
PRAGMA EXCEPTION_INIT(e_no_dept, -20002);
BEGIN
emp_package.add_emp_proc(v_empno, v_ename, v_sal, v_deptno);
COMMIT;
EXCEPTION
WHEN e_dup_val THEN
DBMS_OUTPUT.put_line(SQLERRM);
WHEN e_no_dept THEN
DBMS_OUTPUT.put_line(SQLERRM);
ROLLBACK;
END;

调用上述包-->删除过程

DECLARE
v_empno emp.empno%TYPE := &empno;
e_no_emp EXCEPTION;
PRAGMA EXCEPTION_INIT(e_no_emp, -20009);
BEGIN
emp_package.del_emp_proc(v_empno);-- 调用包中的删除过程
COMMIT;
EXCEPTION
WHEN e_no_emp THEN
DBMS_OUTPUT.put_line(SQLERRM);
ROLLBACK;
END;

综合实例1: 创建包规范和包体

--创建包规范
CREATE OR REPLACE PACKAGE package1
IS
v_no emp.deptno%TYPE := 10;
--过程
PROCEDURE query_emp(v_deptno IN NUMBER DEFAULT v_no, v_avgsal OUT NUMBER,
v_cnt OUT NUMBER);
END package1; --创建包体
CREATE OR REPLACE PACKAGE BODY package1
IS
PROCEDURE query_emp(v_deptno IN NUMBER DEFAULT v_no, v_avgsal) OUT NUMBER,
v_cnt OUT NUMBER)
IS
BEGIN
SELECT avg(sal), count(*) INTO v_avgsal, v_cnt FROM emp
WHERE deptno = v_deptno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('没有此部门');
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
END package1;

调用包中的存储过程  语法为: 包名.元素名称(组件名称)

DECLARE
v_avgsal NUMBER;
v_cnt NUMBER;
BEGIN
package1.query_emp(20, v_avgsal, v_cnt);
DBMS_OUTPUT.put_line('平均工资:' || v_avgsal);
DBMS_OUTPUT.put_line('总人数:' || v_cnt);
END;

综合实例2: 根据员工号查询工资,如果工资小于等于3000,工资涨500。

--创建包规范
CREATE OR REPLACE PACKAGE emp_sal_pkg
IS
FUNCTION get_sal(eno NUMBER) RETURN NUMBER; PROCEDURE upd_sal(eno NUMBER, salary NUMBER);
END emp_sal_pkg; --包体
CREATE OR REPLACE PACKAGE BODY emp_sal_pkg
IS
FUNCTION get_sal(eno NUMBER) RETURN NUMBER
IS
v_sal emp.sal%TYPE := 0;
BEGIN
SELECT sal INTO v_sal FROM emp WHERE empno = eno;
RETURN v_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20010,'此员工号不存在');
END; PROCEDURE upd_sal(eno NUMBER, salary NUMBER)
IS
BEGIN
IF salary <=3000 THEN
UPDATE emp SET sal = sal + 500 WHERE empno = eno;
END IF;
END;
END emp_sal_pkg;

调用上述包:

DECLARE
v_empno emp.empno%TYPE := &empno;
v_salary emp.sal%TYPE;
e_no_emp EXCEPTION;
PRAGMA EXCEPTION_INIT(e_no_emp, -20010);
BEGIN
v_salary := emp_sal_pkg.get_sal(v_empno); --调用包中的函数
emp_sal_pkg.upd_sal(v_empno, v_salary);--调用包中的过程
COMMIT;
EXCEPTION
WHEN e_no_emp THEN
DBMS_OUTPUT.put_line(SQLERRM);
END;

pl/sql学习(4): 包package的更多相关文章

  1. oracle 学习(五)pl/sql语言存储过程&包

    首先搞清楚俩概念 存储过程(procedure)&程序包(package) 存储过程:数据库对象之一,可以理解为数据库的子程序,在客户端和服务器端可以直接调用它.触发器是与表直接关联的特殊存储 ...

  2. Oracle数据库之开发PL/SQL子程序和包

    Oracle数据库之开发PL/SQL子程序和包   PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保 ...

  3. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  4. PL/SQL重新编译包无反应案例2

    在这篇"PL/SQL重新编译包无反应"里面介绍了编译包无反应的情况,今天又遇到一起案例, 在测试环境中,一个包的STATUS为INVALID,重新编译时,一直处于编译状态,检查发现 ...

  5. PL/SQL学习笔记之包

    一:包 包是由一组相关的函数,过程,变量,游标等PL/SQL程序设计元素的组合而成的一个PL/SQL程序单元,相当于Java中的类. 包的主要作用是封装:把相同或相似的东西归类,方便维护和管理,提高开 ...

  6. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  7. PL/SQL 包头和包体

    包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成,包规范用于定义公用的常量 变量,过程和函数,在SQL*PLUS中建立包规范可以使用CREATE PACKAGE命令. 实例如下: CREAT ...

  8. 二十三、oracle pl/sql分类三 包

    包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成.1).我们可以使用create package命令来创建包,如:i.创建一个包sp_packageii.声明该包有一个过程update_sal ...

  9. 开发PL/SQL子程序和包及使用PL/SQL编写触发器、在JDBC中应用Oracle

    1.  子程序的各个部分: 声明部分.可执行部分.异常处理部分(可选) 2.子程序的分类: A.  过程 - 执行某些操作 a.  创建过程的语法: CREATE [OR REPLACE]  PROC ...

随机推荐

  1. 8 ServletContext

    1 为什么需要ServletContext 技术 显示网站多少人在线,显示当前登录者是第几位登录者等信息. 2 什么是ServletContext 可以把它想象成一个服务器上的公共空间,每个用户都可以 ...

  2. window.onload 与 $(document).ready() 的区别

    以浏览器装载文档为例,在页面加载完毕后,浏览器会通过 JavaScript 为 DOM 元素添加事件.在常规的 JavaScript 代码中,通常使用 window.onload 方法 ,而在 jQu ...

  3. python爬虫爬取赶集网数据

    一.创建项目 scrapy startproject putu 二.创建spider文件 scrapy genspider  patubole patubole.com   三.利用chrome浏览器 ...

  4. Linux下开启和关闭Telnet服务

    telnet与ssh相比,安全性能并不高,但是在SSH版本升级或者其他的情况下还是需要开启这一服务. linux提供服务是由运行在后台的守护程序(daemon)来执行的,telnet服务是由xinet ...

  5. vs2017开发IOS(vs2017 xamarin 连接mac)

    这两天突然记起巨软的Visual Studio 2017 好像有说可以用C#开发IOS和Android应用,所以就自己去尝试了下生成过程. 相对与IOS来说,Android的生成过程还是比较容易的没有 ...

  6. Sumdiv POJ 1845

    http://poj.org/problem?id=1845 题目 Time Limit: 1000MS   Memory Limit: 30000K Description Consider two ...

  7. [BZOJ 4516] [SDOI 2016] 生成魔咒

    Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...

  8. Android : Resource is not a Drawable (color or path)

    错误1:android.content.res.Resources$NotFoundException 错误2:Resource is not a Drawable (color or path) 解 ...

  9. hdu 5536 Chip Factory (01 Trie)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题面; Chip Factory Time Limit: 18000/9000 MS (Java/O ...

  10. 初识并发编程 MPI

    MPI是一个跨语言的通讯协议,用于并发编程.MPI标准定义了一组具有可移植性的编程接口. 安装环境 MPICH 是开源的消息传递接口(MPI)标准的实现. 下载地址 # 解压文件 tar -xzvf ...