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

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

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

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

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

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

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

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

创建包规范语法

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

实例1:

  1. CREATE OR REPLACE PACKAGE emp_package
  2. IS
  3. --添加员工信息的存储过程
  4. PROCEDURE add_emp_proc
  5. (v_empno IN emp.empno%TYPE,
  6. v_ename IN emp.ename%TYPE,
  7. v_sal IN emp.sal%TYPE,
  8. v_deptno IN emp.deptno%TYPE);
  9.  
  10. --删除员工信息的存储过程
  11. PROCEDURE del_emp_proc (v_empno IN emp.empno%TYPE);
  12. END emp_package;

创建包体的语法

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

调用包:  包名.元素名称

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

实例2:

  1. CREATE OR REPLACE PACKAGE BODY emp_package
  2. IS
  3. --添加员工信息的存储过程
  4. PROCEDURE add_emp_proc
  5. (v_empno IN emp.empno%TYPE,
  6. v_ename IN emp.ename%TYPE,
  7. v_sal IN emp.sal%TYPE,
  8. v_deptno IN emp.deptno%TYPE)
  9. IS
  10. e_2291 EXCEPTION;
  11. PRAGMA EXCEPTION_INIT(e_2291, -2291);
  12. BEGIN
  13. INSERT INTO emp(empno, ename, sal, deptno)
    VALUES(v_empno, v_ename, v_sal, v_deptno);
  14. EXCEPTION
  15. WHEN DUP_VAL_ON_INDEX THEN
  16. RAISE_APPLICATION_ERROR(-20001, '员工号不能重复');
  17. WHEN e_2291 THEN
  18. RAISE_APPLICATION_ERROR(-20002, '部门号不存在');
  19. END;
  20.  
  21. --删除员工信息的存储过程
  22. PROCEDURE del_emp_proc
  23. (v_empno IN emp.empno%TYPE)
  24. IS
  25. BEGIN
  26. --根据员工号删除指定的员工信息
  27. DELETE FROM emp WHERE empno = v_empno;
  28. --判断是否删除成功
  29. IF SQL%NOTFOUND THEN
  30. RAISE_APPLICATION_ERROR(-20009, '指定删除的员工不存在');
  31. ELSE
  32. DBMS_OUTPUT.PUT_line('删除成功');
  33. END IF;
  34. END;
  35. END emp_package;

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

  1. DECLARE
  2. v_empno emp.empno%TYPE := &empno;
  3. v_ename emp.ename%TYPE := '&name';
  4. v_sal emp.sal%TYPE := &salary;
  5. v_deptno emp.deptno%TYPE := &deptno;
  6. e_dup_val EXCEPTION;
  7. e_no_dept EXCEPTION;
  8.  
  9. PRAGMA EXCEPTION_INIT(e_dup_val, -20001);
  10. PRAGMA EXCEPTION_INIT(e_no_dept, -20002);
  11. BEGIN
  12. emp_package.add_emp_proc(v_empno, v_ename, v_sal, v_deptno);
  13. COMMIT;
  14. EXCEPTION
  15. WHEN e_dup_val THEN
  16. DBMS_OUTPUT.put_line(SQLERRM);
  17. WHEN e_no_dept THEN
  18. DBMS_OUTPUT.put_line(SQLERRM);
  19. ROLLBACK;
  20. END;

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

  1. DECLARE
  2. v_empno emp.empno%TYPE := &empno;
  3. e_no_emp EXCEPTION;
  4. PRAGMA EXCEPTION_INIT(e_no_emp, -20009);
  5. BEGIN
  6. emp_package.del_emp_proc(v_empno);-- 调用包中的删除过程
  7. COMMIT;
  8. EXCEPTION
  9. WHEN e_no_emp THEN
  10. DBMS_OUTPUT.put_line(SQLERRM);
  11. ROLLBACK;
  12. END;

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

  1. --创建包规范
  2. CREATE OR REPLACE PACKAGE package1
  3. IS
  4. v_no emp.deptno%TYPE := 10;
  5. --过程
  6. PROCEDURE query_emp(v_deptno IN NUMBER DEFAULT v_no, v_avgsal OUT NUMBER,
    v_cnt OUT NUMBER);
  7. END package1;
  8.  
  9. --创建包体
  10. CREATE OR REPLACE PACKAGE BODY package1
  11. IS
  12. PROCEDURE query_emp(v_deptno IN NUMBER DEFAULT v_no, v_avgsal) OUT NUMBER,
    v_cnt OUT NUMBER)
  13. IS
  14. BEGIN
  15. SELECT avg(sal), count(*) INTO v_avgsal, v_cnt FROM emp
    WHERE deptno = v_deptno;
  16. EXCEPTION
  17. WHEN NO_DATA_FOUND THEN
  18. dbms_output.put_line('没有此部门');
  19. WHEN OTHERS THEN
  20. dbms_output.put_line(SQLERRM);
  21. END;
  22. END package1;

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

  1. DECLARE
  2. v_avgsal NUMBER;
  3. v_cnt NUMBER;
  4. BEGIN
  5. package1.query_emp(20, v_avgsal, v_cnt);
  6. DBMS_OUTPUT.put_line('平均工资:' || v_avgsal);
  7. DBMS_OUTPUT.put_line('总人数:' || v_cnt);
  8. END;

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

  1. --创建包规范
  2. CREATE OR REPLACE PACKAGE emp_sal_pkg
  3. IS
  4. FUNCTION get_sal(eno NUMBER) RETURN NUMBER;
  5.  
  6. PROCEDURE upd_sal(eno NUMBER, salary NUMBER);
  7. END emp_sal_pkg;
  8.  
  9. --包体
  10. CREATE OR REPLACE PACKAGE BODY emp_sal_pkg
  11. IS
  12. FUNCTION get_sal(eno NUMBER) RETURN NUMBER
  13. IS
  14. v_sal emp.sal%TYPE := 0;
  15. BEGIN
  16. SELECT sal INTO v_sal FROM emp WHERE empno = eno;
  17. RETURN v_sal;
  18. EXCEPTION
  19. WHEN NO_DATA_FOUND THEN
  20. RAISE_APPLICATION_ERROR(-20010,'此员工号不存在');
  21. END;
  22.  
  23. PROCEDURE upd_sal(eno NUMBER, salary NUMBER)
  24. IS
  25. BEGIN
  26. IF salary <=3000 THEN
  27. UPDATE emp SET sal = sal + 500 WHERE empno = eno;
  28. END IF;
  29. END;
  30. END emp_sal_pkg;

调用上述包:

  1. DECLARE
  2. v_empno emp.empno%TYPE := &empno;
  3. v_salary emp.sal%TYPE;
  4. e_no_emp EXCEPTION;
  5. PRAGMA EXCEPTION_INIT(e_no_emp, -20010);
  6. BEGIN
  7. v_salary := emp_sal_pkg.get_sal(v_empno); --调用包中的函数
  8. emp_sal_pkg.upd_sal(v_empno, v_salary);--调用包中的过程
  9. COMMIT;
  10. EXCEPTION
  11. WHEN e_no_emp THEN
  12. DBMS_OUTPUT.put_line(SQLERRM);
  13. 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. Python——threading模块(线程)

    一.threading模块的对象 Thread:表示一个执行线程的对象 Lock:锁 Rlock:可重入锁对象 Condition:条件变量对象,使得一个线程等待另一个线程满足特定的“条件” Even ...

  2. IntelliJ IDEA 2018 设置代码超出限制自动换行(最新版)

    环境信息 * IntelliJ IDEA版本:ULTIMATE 2018.2.3:* 系统:Windows 10: 怎么设置IntelliJ IDEA 2018代码一行的换行宽度限制呢? 设置方法:` ...

  3. 关于Qt的StyleSheet作用范围

    Qt的StyleSheet是很方便的一个设置各种控件风格形态的属性,但是默认的StyleSheet会作用于所有的子控件,容易带来麻烦,以下几种情况,可以限制作用范围 以QTextEdit为例,实体名为 ...

  4. BZOJ4241历史研究——回滚莫队

    题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...

  5. 协方差(Covariance)

    统计学上用方差和标准差来度量数据的离散程度 ,但是方差和标准差是用来描述一维数据的(或者说是多维数据的一个维度),现实生活中我们常常会碰到多维数据,因此人们发明了协方差(covariance),用来度 ...

  6. bzoj 1058: [ZJOI2007]报表统计 (Treap)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...

  7. 20165223 《信息安全系统设计基础》 实现mybash

    一.了解 mybash 1. 简介   bash 是 Bourne Again Shell 的缩写,是linux默认的标准shell(也是大家常说的系统内核),bash也是Unix/Linux上常见的 ...

  8. python之路day05--字典的增删改查,嵌套

    字典dic 数据类型划分:可变数据类型,不可变数据类型 不可变数据类型:元组,bool,int str -->可哈希可变数据类型:list,dict,set --> 不可哈希 dict k ...

  9. centos7 LNMP

    Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 一.安装Nginx 1.安装依赖扩展 # yum -y install wget openssl* gcc gcc-c++ ...

  10. Qt调用自己编译的libglog.a出现问题

    我确定依据正确导入库后,依旧出现未定义的引用. undefined reference to _imp___ZN6google17InitGoogleLoggingEPKc 尝试过重新编译,调整编译参 ...