pl/sql学习(4): 包package
本文简单介绍包, 目前来看我用的不多, 除了之前 为了实现 一个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的更多相关文章
- oracle 学习(五)pl/sql语言存储过程&包
首先搞清楚俩概念 存储过程(procedure)&程序包(package) 存储过程:数据库对象之一,可以理解为数据库的子程序,在客户端和服务器端可以直接调用它.触发器是与表直接关联的特殊存储 ...
- Oracle数据库之开发PL/SQL子程序和包
Oracle数据库之开发PL/SQL子程序和包 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保 ...
- ORALCE PL/SQL学习笔记
ORALCE PL/SQL学习笔记 详情见自己电脑的备份数据资料
- PL/SQL重新编译包无反应案例2
在这篇"PL/SQL重新编译包无反应"里面介绍了编译包无反应的情况,今天又遇到一起案例, 在测试环境中,一个包的STATUS为INVALID,重新编译时,一直处于编译状态,检查发现 ...
- PL/SQL学习笔记之包
一:包 包是由一组相关的函数,过程,变量,游标等PL/SQL程序设计元素的组合而成的一个PL/SQL程序单元,相当于Java中的类. 包的主要作用是封装:把相同或相似的东西归类,方便维护和管理,提高开 ...
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- PL/SQL 包头和包体
包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成,包规范用于定义公用的常量 变量,过程和函数,在SQL*PLUS中建立包规范可以使用CREATE PACKAGE命令. 实例如下: CREAT ...
- 二十三、oracle pl/sql分类三 包
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成.1).我们可以使用create package命令来创建包,如:i.创建一个包sp_packageii.声明该包有一个过程update_sal ...
- 开发PL/SQL子程序和包及使用PL/SQL编写触发器、在JDBC中应用Oracle
1. 子程序的各个部分: 声明部分.可执行部分.异常处理部分(可选) 2.子程序的分类: A. 过程 - 执行某些操作 a. 创建过程的语法: CREATE [OR REPLACE] PROC ...
随机推荐
- Python——threading模块(线程)
一.threading模块的对象 Thread:表示一个执行线程的对象 Lock:锁 Rlock:可重入锁对象 Condition:条件变量对象,使得一个线程等待另一个线程满足特定的“条件” Even ...
- IntelliJ IDEA 2018 设置代码超出限制自动换行(最新版)
环境信息 * IntelliJ IDEA版本:ULTIMATE 2018.2.3:* 系统:Windows 10: 怎么设置IntelliJ IDEA 2018代码一行的换行宽度限制呢? 设置方法:` ...
- 关于Qt的StyleSheet作用范围
Qt的StyleSheet是很方便的一个设置各种控件风格形态的属性,但是默认的StyleSheet会作用于所有的子控件,容易带来麻烦,以下几种情况,可以限制作用范围 以QTextEdit为例,实体名为 ...
- BZOJ4241历史研究——回滚莫队
题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...
- 协方差(Covariance)
统计学上用方差和标准差来度量数据的离散程度 ,但是方差和标准差是用来描述一维数据的(或者说是多维数据的一个维度),现实生活中我们常常会碰到多维数据,因此人们发明了协方差(covariance),用来度 ...
- bzoj 1058: [ZJOI2007]报表统计 (Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...
- 20165223 《信息安全系统设计基础》 实现mybash
一.了解 mybash 1. 简介 bash 是 Bourne Again Shell 的缩写,是linux默认的标准shell(也是大家常说的系统内核),bash也是Unix/Linux上常见的 ...
- python之路day05--字典的增删改查,嵌套
字典dic 数据类型划分:可变数据类型,不可变数据类型 不可变数据类型:元组,bool,int str -->可哈希可变数据类型:list,dict,set --> 不可哈希 dict k ...
- centos7 LNMP
Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 一.安装Nginx 1.安装依赖扩展 # yum -y install wget openssl* gcc gcc-c++ ...
- Qt调用自己编译的libglog.a出现问题
我确定依据正确导入库后,依旧出现未定义的引用. undefined reference to _imp___ZN6google17InitGoogleLoggingEPKc 尝试过重新编译,调整编译参 ...