iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle专题15之包
  • 145
分享到

Oracle专题15之包

2024-04-02 19:04:59 145人浏览 薄情痞子
摘要

1、包的概述 a、什么是包? 包是一组相关过程、函数、变量、常量和游标等PL/sql程序设计元素的组合。 b、包的特点? 它具有面向对象程序设计语言的特点,是对PL/SQL程序设计元素(过程、函数、变量等

1、包的概述

a、什么是包?

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

    b、包的特点?

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

    c、包中的程序元素

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

    e、包的组成

  • 一个包由两个分开的部分组成:
  • 包规范(包定义):用于定义包的公用组件,包括常量、变量、游标、过程和函数等。
  • 包体(包主体):用于实现包规范所定义的公用过程和函数。包体不仅可用于实现公用过程和函数,而且还可以定义包的私有组件(变量、游标、过程、函数等)。

    f、简单代码示例

  • 创建包规范和包体的示例代码
    --创建包规范
    CREATE OR REPLACE PACKAGE first_package
    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 first_package;
    --创建包体
    CREATE OR REPLACE PACKAGE BODY first_package
    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 first_package;
  • 调用包中的存储过程:
    DECLARE
        v_avgsal NUMBER;
        v_cnt NUMBER;
    BEGIN
        first_package.query_emp(20, v_avgsal, v_cnt);
        DBMS_OUTPUT.put_line('平均工资:' || v_avgsal);
        DBMS_OUTPUT.put_line('总人数:' || v_cnt);
    END;

    2、包的创建

    a、创建包规范

  • 语法格式如下:
    CREATE [OR REPLACE] PACKAGE package_name
    IS | AS
    -- 定义公用常量、变量、游标、过程、函数等
    END [package_name];
  • 示例代码:

    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;

    b、创建包体

  • 语法格式如下:
    CREATE [OR REPLACE] PACKAGE BODY package_name 
    IS | AS
    --定义私有常量、变量、游标、过程和函数等
    --实现公用过程和函数
    END [package_name];
  • 示例代码:

    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;

    c、包创建的过程案例代码

  • 根据员工号查询工资,如果工资小于等于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;  

    3、包的调用和删除

    a、包的调用

  • 对包内共有元素(公用组件)的调用格式为:包名.元素名称(组件名称)
  • 例如:emp_package.del_emp_proc();

    b、 包的调用示例1

  • 调用emp_package包下添加员工信息的存储过程。(在本专题的第2节包的创建,已经在oracle数据库中创建emp_package包规范和包体)
    Oracle专题15之包

    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;

    b、包的调用示例2

  • 调用emp_package包下删除员工信息的存储过程。(在本专题的第2节包的创建,已经在Oracle数据库中创建emp_package包规范和包体)
    Oracle专题15之包
    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;

    c、包的调用示例3

  • 调用emp_sal_pkg包下的过程和函数:(在本专题的第2节包的创建,已经在Oracle数据库中创建emp_sal_pkg包规范和包体)
    Oracle专题15之包
    1、调用根据员工号返回员工工资的函数
    2、调用更新满足条件的员工工资的过程
    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;

    d、如何在SQLPlus窗口中进行包的调用

  • 示例1:在SQLPlus窗口中进行emp_sal_pkg包的调用,查询员工的工资信息:

    SQL> VAR v_empno NUMBER
    SQL> EXEC :v_empno := &no
    
    PL/SQL procedure successfully completed
    
    v_empno
    ---------
    1234
    
    SQL> VAR v_salary NUMBER
    SQL> EXEC :v_salary := emp_sal_pkg.get_sal(:v_empno)
    begin :v_salary := emp_sal_pkg.get_sal(:v_empno); end;
    
    ORA-20010: 此员工号不存在
    ORA-06512: 在 "SCOTT.EMP_SAL_PKG", line 11
    ORA-06512: 在 line 1
    v_salary
    ---------
    v_empno
    ---------
    1234
  • 示例2:在SQLPlus窗口中进行emp_sal_pkg包的调用,更新员工的工资信息:(变量v_empno已经在示例1中定义)

    SQL> EXEC :v_empno := &no
    
    PL/SQL procedure successfully completed
    
    v_empno
    ---------
    7369
    
    SQL> EXEC :v_salary := emp_sal_pkg.get_sal(:v_empno)
    
    PL/SQL procedure successfully completed
    
    v_salary
    ---------
    800
    v_empno
    ---------
    7369
    
    SQL> EXEC emp_sal_pkg.upd_sal(:v_empno, :v_salary)
    
    PL/SQL procedure successfully completed
    
    v_empno
    ---------
    7369
    v_salary
    ---------
    800
    
    SQL> SELECT ename, sal from emp WHERE empno = 7369;
    
    ENAME            SAL
    ---------- ---------
    G_EASON      1300.00
  • 在SQLPlus环境中,可以使用 [VAR 变量名 变量类型]命令定义变量。

    e、包的删除

  • 可以使用DROP PACKAGE命令对不需要的包进行删除,语法如下:
    DROP PACKAGE [BODY] [user.] package_name;

    4、子程序重载

    a、什么是子程序重载?

  • 所谓重载是指两个或者多个子程序有相同的名称,但是拥有不同的参数变量、参数顺序或者参数数据类型。

    b、示例代码

  • 示例:1、根据员工号或者员工姓名获取员工信息;2、根据员工号或者员工姓名删除员工的信息。

    --创建包规范
    CREATE OR REPLACE PACKAGE overload_pkg
    IS
                 FUNCTION get_info(eno NUMBER) RETURN emp%ROWTYPE;
                 FUNCTION get_info(name VARCHAR) RETURN emp%ROWTYPE;
    
                 PROCEDURE del_emp(eno NUMBER);
                 PROCEDURE del_emp(name VARCHAR);
    END;
    --创建包体
        CREATE OR REPLACE PACKAGE BODY overload_pkg
    IS
                 FUNCTION get_info(eno NUMBER) RETURN emp%ROWTYPE
                 IS
                                    emp_record emp%ROWTYPE;
                 BEGIN
                                    SELECT * INTO emp_record FROM emp WHERE empno = eno;
                                    RETURN emp_record;
                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                             RAISE_APPLICATION_ERROR(-20020, '不存在此员工');
                 END;
    
                 FUNCTION get_info (name VARCHAR) RETURN emp%ROWTYPE
                 IS
                                    emp_record emp%ROWTYPE;
                 BEGIN
                                    SELECT * INTO emp_record FROM emp WHERE ename= name;
                                    RETURN emp_record;
                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                        RAISE_APPLICATION_ERROR(-20020, '不存在此员工');
                 END;
    
                 PROCEDURE del_emp(eno NUMBER)
                 IS
                 BEGIN
                     DELETE FROM emp WHERE empno = eno;
                     IF SQL%NOTFOUND THEN
                         RAISE_APPLICATION_ERROR(-20020, '不存在此员工');
                     END IF;
                 END;
    
                 PROCEDURE del_emp(name VARCHAR)
                 IS
                 BEGIN
                     DELETE FROM emp WHERE ename = name;
                     IF SQL%NOTFOUND THEN
                         RAISE_APPLICATION_ERROR(-20020, '不存在此员工');
                     END IF;
                 END;
    END overload_pkg;
  • overload_pkg包的调用示例:
    --根据员工号查询员工信息
    DECLARE
        emp_record emp%rowtype;
        e_no_emp EXCEPTION;
        PRAGMA EXCEPTION_INIT(e_no_emp, -20020);
    BEGIN 
        emp_record := overload_pkg.get_info(&no);
        DBMS_OUTPUT.put_line('员工号:' || emp_record.empno || ',姓名:' || emp_record.ename || ',工资:' || 
        emp_record.sal);
    EXCEPTION
        WHEN e_no_emp THEN
            DBMS_OUTPUT.put_line(SQLERRM);
    END;
    --根据员工姓名查询员工信息
    DECLARE
        emp_record emp%rowtype;
        e_no_emp EXCEPTION;
        PRAGMA EXCEPTION_INIT(e_no_emp, -20020);
    BEGIN 
        emp_record := overload_pkg.get_info('&ename');
        DBMS_OUTPUT.put_line('员工号:' || emp_record.empno || ',姓名:' || emp_record.ename || ',工资:' || 
        emp_record.sal);
    EXCEPTION
        WHEN e_no_emp THEN
            DBMS_OUTPUT.put_line(SQLERRM);
    END;
    --根据员工号删除员工信息
    DECLARE 
        e_no_emp EXCEPTION;
        PRAGMA EXCEPTION_INIT(e_no_emp, -20020);
    BEGIN
        overload_pkg.del_emp(&no);
        COMMIT;
    EXCEPTION
        WHEN e_no_emp THEN
            DBMS_OUTPUT.put_line(SQLERRM);
        ROLLBACK;
    END;
    
    --根据员工姓名删除员工信息
    DECLARE 
        e_no_emp EXCEPTION;
        PRAGMA EXCEPTION_INIT(e_no_emp, -20020);
    BEGIN
        overload_pkg.del_emp('&ename');
        COMMIT;
    EXCEPTION
        WHEN e_no_emp THEN
            DBMS_OUTPUT.put_line(SQLERRM);
        ROLLBACK;
    END;
您可能感兴趣的文档:

--结束END--

本文标题: Oracle专题15之包

本文链接: https://www.lsjlt.com/news/36691.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle专题3之Oracle数据表的
    Oracle SQL Developer是Oracle官方出品的免费图形化开发工具,相对于SQL * Plus来说,图形化的界面便于操作,不必记忆大量的命令,输出结果美观。它的基本功能有结果的格式化输出、编辑器自动提示、代码优化、显示...
    99+
    2023-01-31
    数据表 专题 Oracle
  • Oracle专题7之多表查询
    什么是多表查询? 多表查询就是从多个表中获取数据。 1、笛卡尔集 笛卡尔集是集合中的一种。假设A和B都是集合,A和B的笛卡尔集用 A B来表示。即A B所形成的集合叫做笛卡尔集。 下表中,部门表员工表...
    99+
    2024-04-02
  • oracle 12c flex cluster专题 之 节点角色转换
     沃趣科技   周天鹏 笔者上一篇译文中在介绍Leaf Node时提到, **虽然leaf node不要求直接访问共享存储,但最好还是连上共享存储,因为说不准未来哪天就要把这个lea...
    99+
    2022-11-30
    12c cluster 转换
  • MySQL专题3之MySQL管理
    1、启动以及关闭MySQL服务器-  首先,我们需要通过以下命令来检查MySQL服务器是否已经启动:ps -ef | grep mysqld-  如果MySQL已经启动,以上命令将输出mysql进程列表,如果mysql未启动,你可以使用以下...
    99+
    2023-01-31
    专题 MySQL
  • SSM框架之MyBatis3专题3:关联
    当查询内容涉及具有关联关系的多个表时,就需要使用关联关系查询。根据表与表之间的关联关系的不同,关联查询分为四种:1、一对一关联查询;2、一对多关联查询;3、多对一关联查询;4、多对多关联查询; 由于日常工作中最常见的关联关系是一对多、多...
    99+
    2023-01-31
    框架 专题 SSM
  • JavaScript专题之underscore防抖实例学习
    目录前言防抖第一版thisevent 对象返回值立刻执行取消JavaScript 专题系列第一篇,讲解防抖,带你从零实现一个 underscore 的 debounce 函数 前言 ...
    99+
    2024-04-02
  • 剑指Offer之Java算法习题精讲链表专题篇
    题目一  解法 class Solution { public int getDecimalValue(ListNode head) { int[] ...
    99+
    2024-04-02
  • WPF之AvalonEdit 代码高亮编辑控件专题
    WPF之AvalonEdit是一个强大的代码高亮编辑控件,它提供了许多丰富的功能,如语法高亮、代码折叠、智能缩进等。本专题将介绍Av...
    99+
    2023-09-23
    WPF
  • Windows 8.1装完之后的15个小问题及解决方案
      作为Windows 8的改进版本,Windows 8.1显然被给予厚望,比如新增的开始按钮、SkyDrive文件云端同步功能等等。不过,没有一款产品是完美的,Windows 8.1还是拥有一些令人苦恼的小问题,可能随...
    99+
    2023-06-02
    Win8.1 装完设置 Windows 8.1 方案 问题 解决
  • 包对象之Oracle如何编译失效包体
    主题:如何Oracle编译失效的包体 作者:基毛飞上天 情况说明:在吗?可以帮忙重新编译一个包吗?我们这边编译不了! 处理思维: (1)包头失效还是包体失效? (2)是否存在阻碍的进程影响重新编译...
    99+
    2024-04-02
  • MySQL与PHP的基础与应用专题之索引
    概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 索引 索引 (Index) 是一种特殊的数据结构, 类似于图书的目录. 索引能够极大的提升数据库的查询效率. 如...
    99+
    2024-04-02
  • Spring Cloud 专题之Sleuth 服务跟踪实现方法
    目录准备工作实现跟踪抽样收集整合Zipkin1.下载Zipkin2.引入依赖配置3.测试与分析持久化到mysql1.创建zipkin数据库2.启动zipkin3.测试与分析在一个微服...
    99+
    2024-04-02
  • 剑指Offer之Java算法习题精讲二叉树专题篇上
    来和二叉树玩耍吧~ 题目一  解法 class Solution { public boolean isSymmetric(TreeNode root) { ...
    99+
    2024-04-02
  • 剑指Offer之Java算法习题精讲二叉树专题篇下
    题目一  解法 class Solution { public int maxDepth(TreeNode root) { return m...
    99+
    2024-04-02
  • Oracle网络配置之共享模式和专有模式
    概念 对于连接数不多的应用,适宜用专有连接,客户的请求响应及时; 对于连接数较大的应用,适宜用共享连接,充分利用系统资源; remote_listener...
    99+
    2024-04-02
  • MySQL与PHP的基础与应用专题之表连接
    概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 表连接 表连接 (JOIN) 是在多个表之间通过连接条件. 使表之间发生关联, 进而能从多个表之间获取数据. ...
    99+
    2024-04-02
  • MySQL与PHP的基础与应用专题之自连接
    概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 自连接 自连接 (Self Join) 是一种特殊的表连接. 自连接指相互连接的表在物理上同为一张表, 但是逻辑...
    99+
    2024-04-02
  • Oracle 应用之--VirtualBox UUID问题
    Oracle 应用之--VirtualBox UUID问题系统环境:    操作系统: MAC OS 10.10.3    应用软件:VirtualBox故障:&nb...
    99+
    2024-04-02
  • MySQL与PHP的基础与应用专题之增删改查
    概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 添加数据 SQL 语句: # 插入单条数据 INSERT INTO 表名 (列名1, 列名2, …) VAL...
    99+
    2024-04-02
  • MySQL与PHP的基础与应用专题之数据控制
    目录概述数据控制语言MySQL权限体系用户管理创建用户删除用户修改密码权限管理查看权限用户授权撤销授权刷新权限注意事项概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作