本文简单介绍包, 目前来看我用的不多, 除了之前 为了实现 一个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. 打开Player时出现时间格式的错误提示

    安装完Player后如果更改了Windows的系统时间和日期显示格式,再次打开Player后会出现时间日期格式错误的提醒,需要按照要求更改Windows系统设置,才能正常运行Player. 此错误提示 ...

  2. Shell命令-文件及目录操作之cp、find

    文件及目录操作 - cp.find 1.cp:复制文件或目录 cp命令的功能说明 cp命令用于复制文件或目录. cp命令的语法格式 cp [OPTION]... SOURCE... DIRECTORY ...

  3. AngularJS 1.x系列:AngularJS过滤器(4)

    1. AngularJS过滤器(Filter)使用方法 AngularJS中过滤器(Filter)主要功能是格式化数据. AngularJS过滤器使用方法有3种: ◊ 在表达式{{}}中使用 ◊ 在指 ...

  4. bzoj-1179(缩点+最短路)

    题意:中文题面 解题思路:因为他能重复走且边权都正的,那么肯定一个环的是必须走完的,所以先缩点,在重新建一个图跑最长路 代码: #include<iostream> #include< ...

  5. 使用css实现无滚动条滚动+使用插件自定义滚动条样式

    使用css实现无滚动条滚动,摘抄自:曹小萌博客 使用css实现无滚动条滚动,大体思路是在div外面再套一个div.这个div设置overflow:hidden.而内容div设置 overflow-x: ...

  6. position:sticky

    使用sticky定位可以简洁的实现固定功能 例如,左右布局页面,左侧菜单,右侧内容,内容区域滚动时,不希望菜单区域滚动,而是固定不动 以往要实现这个功能,需要使用fixed定位菜单,菜单脱离文档流,布 ...

  7. maven在windows及linux环境下安装

    maven下载 下载地址:https://maven.apache.org/download.cgi maven在windows下安装 解压到D盘 修改配置文件 进入conf,打开settings.x ...

  8. AGC027B Garbage Collector

    一道很好的构造题 原题链接 很快就能想到,捡每个垃圾的能量可以最后再算.然后,对于每个垃圾,在路上耗费的能量仅与它是第几个被捡的有关,于是我们考虑将垃圾分组. 首先,我们定义\(F(x,i)\)为某次 ...

  9. 用SERVLET进行用户名和密码验证

    一.界面展示 二.登录成功显示 三.代码 html <!DOCTYPE html> <html> <head> <meta charset="UTF ...

  10. PLSQL Developer 远程连接Oracle数据库

    下载.安装.激活PLSQL Developer,本例使用 PLSQL Developer 13 (64 bit). 下载Oracle即时客户端 Instant Client,本例使用11gR2 链接: ...