oracle 包的管理

在PL/SQL程序开发中,为了方便实现模块化程序的管理,可以将PL/SQL元素(如存储过程、函数、变量、常量、自定义数据类型、游标等)根据模块的程序结构组织在一起,存放在一个包中,称为一个完整的单元,并在编译之后存储在数据库服务器中,作为一种全局结构,供应用程序调用。
在Oracle数据库中,包有两类,一类是系统内置的包,每个包实现特定的应用过程、函数、常量等的集合,如DBMS_OUTPUT.put_line()就是调用了DBMS_OUTPUT包中的put_line()函数;
另一类是根据应用需要由用户创建的包。
包由包规范(specification)和包体(body)两部分组成,在数据库中独立存储。包的创建包括包规范和包体的创建。
2.包的创建和应用

  1. 包的创建
    创建包规范的格式如下:
    CREATE [OR REPLACE] PACKAGE 包名称IS|AS
    元素名称定义(类型、变量、存储过程、函数、游标、异常等)
    END [包名称];
    元素声明的顺序可以是任意的,但必须先声明再使用。过程和函数只声明,不进行具体的实现。
    包体负责包规范中定义的函数或存储过程的具体代码实现,如果在包体中定义了包规范中没有的元素,则此部分元素将被设置为私有访问,只能由同一包中的函数或存储过程使用。此外只有在包规范已经创建的条件下,才可以创建包体,如果包规范中不包含任何函数或存储过程,则可以不创建包体。
    创建包体的格式如下:
    CREATE [OR REPLACE] PACKAGE BODY 包名称IS|AS
    元素结构实现;
    END [包名称];

    在创建包体时需要注意:
    包体中的名称应与包规范中的包名称保持一致。
    包体中存储过程和函数的声明格式必须与包规范中的声明完全一致。
    包的调用格式如下:
    begin
    pkg_demo.proc_insert_users(‘2022-1-5’,‘yyyy-mm-dd’);
    pkg_demo.proc_update_users(‘2022-10-5’,‘yyyy-mm-dd’);
    end;

【例7-15】创建一个包,该包中包括一个存储过程PRINT_ENAME,在包体中使用存储过程实现输出文字的功能,然后在建立存储过程调用该包。
具体代码如下:

—创建包规范
create or replace package EMPLOYEE_PKG
as
procedure PRINT_ENAME;
end EMPLOYEE_PKG;
—创建包体
CREATE OR REPLACE PACKAGE BODY employee_pkg as
Procedure print_ename is
Begin
Dbms_output.put_line(‘我们一定要学习好数据库’);
End print_ename;
End employee_pkg;

—创建调用该包

CREATE OR REPLACE Procedure callEMPLOYEEPKG
as
begin

EMPLOYEE_PKG.PRINT_ENAME;

End callEMPLOYEEPKG;

执行后,如图7-23所示。
在这里插入图片描述

图7-23执行计算职工年薪函数

2)包的持续性
在包规范中,所有声明的元素都具有全局作用域,元素的值在整个用户会话期间将一直存在,因此在用户会话期间,元素可以在应用程序各个部分的代码中被引用。每个用户会话都会维护属于自己会话的元素的副本,用户之间的元素互不干扰。这种在用户会话期间元素值和状态的持续性被称为包的持续性。包的持续性具体可以体现在包中变量的持续性和游标持续性上。

变量的持续性是指,当用户调用包时,系统会为每个调用者创建属于该用户的变量副本,并在用户的整个会话期间持续存在。包变量对当前会话用户是私有的。
【例7-16】在test用户下创建一个包,该包中包括变量 pkgvar,设置该变量初始值为0。建立存储过程proc_set_var重新给该变量赋值,然后在建立函数fun_get_var 调用包pkgvar。
登录scott用户,在该用户下调用存储过程proc_set_var给变量赋值为10,查询变量 pkgvar
的值。登录sy 用户,在该用户下调用存储过程proc_set_var给变量赋值为20,在scott下查询变量 pkgvar的值。
本例中两个不同用户同时对一个包变量进行存取操作,通过变量值验证包变量在用户会话期间的持续性。
创建包含变量的包,存储过程代码如下:
create or replace package pkg_varas
pkgvar number:=0;
end pkg_var;
–创建设置变量值的存储过程
create or replace procedure proc_set_var(p_var number)as
begin
pkg_var.pkgvar:=p_var;
end proc_set_var;
创建获取包变量值的函数,代码如下:
create or replace function fun_get_var return number
As
begin
return pkg_var.pkgvar;
end fun_get_var;
登录scott 用户,调用存储过程后,查询函数中变量的值,代码如下:
Connect scott/tiger@ ;
EXECUTE proc_set_var(10);
Select fun_ get_var FROM dual ;
执行后,如图7-24所示。
在这里插入图片描述

图7-24查看变量的值

由上述结果可以看出,此时包变量的值为10。接下来通过用户 sys启动另一个 SQL * Plus 窗口,此时访问testt用户下包变量的值仍为初始值0,然后重新设置包变量值为20,代码如下:
登录到sys用户,查看变量的值
Connect sys/sjk@orcl;
–给变量赋值为20
EXECUTE proc_set_var(20);

Select fun_get_var from dual;

接下来回到scott用户下,此时再次查询包变量的值,会发现包变量仍为10,并没有受 用户操作的影响,
3)使用数据字典,查看包
通过查询数据字典视图user_objects、user_source查看当前用户的所有包规范、包体,具体代码如下:
select object_type,object_name,status from user_objectswhere object_type in (‘PACKAGE’,‘PACKAGE BODY’);
执行后如图7-25所示。
在这里插入图片描述

图7-25查看包的基本信息

4)重新编译包
包的重新编译包括对包规范和包体整体进行重新编译或者分别进行重新编译。其语法如下:
alter package 包名称 compile;
alter package 包名称 compile specification;
alter package 包名称 compile body;

COMPILE表示重新编译包规范和包体。
COMPILE SPECIFICATION 表示重新编译包规范。
COMPILE BODY表示重新编译包体。
分别重新编译包规范和包体
alter package pkg_varas compile specification;
alter package pkg_varas compile body;
5)删除包
当不需要使用定义的包规范或包时,用户可以使用删除整个包,也可以只删除包体。
删除包格式如下:
drop package 包的名称;
删除包规范的同时会将其对应的包体一起删除。
6)系统常用包
在Oracle中,除了可以使用用户创建的包外,还可以利用Oracle系统所提供的开发部进行代码的编写,方便应用程序的开发。下述是几个常用的系统包:
dbms_output包:是最常用的一个系统包 。
dbms_output.put_line()函数就是其中的一个子程序。
dbms_alter包:用于数据库报警,允许会话间通信。
dbms_job包:用于任务调度服务。
dbms_lob包:用于处理大对象操作。
dbms_pipe包:用于数据库管道,允许会话间通信。
dbms_sql包:用于执行动态SQL。
utl_file包:用于文件的输入输出。
除了utl_file包存储在服务器和客户端外,其他的包均存储在服务器中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LINUX 5 cat du head tail wc 计算机拓扑结构 计算机网络 服务器 计算机硬件

计算机网络 计算机拓扑结构 计算机按性能指标分:巨型机、大型机、小型机、微型机。大型机、小型机安全稳定,小型机用于邮件服务器 Unix系统。按用途分:专用机、通用机 计算机网络:局域网‘、广域网 通信协议’ 计算机终端、客户端…

从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序

目录 前言 图的概念 1. 顶点和边 2. 图的分类 3. 图的基本性质 图的存储 邻接矩阵存图 邻接表存图 图的基本遍历 拓扑排序 拓扑排序是如何写的呢? 1. 统计每个节点的入度 2. 构建邻接表 3. 将所有入度为 0 的节点加入队列 4. 不断弹出队头节点,更新其…

强化学习Q-Learning:DQN

强化学习Q-Learning/DQN 本文是一篇学习笔记,主要参考李宏毅老师的强化学习课程。 目前主流的强化学习方法大致可以分为 policy-based 和 value-based 两大类。之前我们介绍的 policy gradient 策略梯度,就是 policy-based 的方法。本文要介绍的 Q-learn…

W公司云安全解决方案

1 安全理念DevOpvSec 统一安全运营 2 安全责任分层模型 3 云安全产品线 4 云安全解决方案/部署架构 5 安全能力 6 信创云平台适配 7 统一化安全运营 利用云安全平台实现统一的安全运维 8 安全资源池的统一纳管 9 案例分享:私有云 10 云安全解决方案的衍生特点 11 …

python中的in关键字查找的时间复杂度

列表(List) 对于列表来说, in 运算符的复杂度是 O(n),其中n是列表的长度。这意味着如果列表中有n个元素,那么执行 in 运算符需要遍历整个列表来查找目标元素。 以下是一个示例,演示了在列表中使用 in 运算…

MySQL基础 [一] - Ubuntu版本安装

目录 预安装 先查看自己操作系统的版本 添加MySQL APT下载源 下载 安装 正式安装 查看MySQL状态 打开MySQL 预安装 先查看自己操作系统的版本 lsb_release -a 添加MySQL APT下载源 下载 下载发布包 下载地址 : https://dev.mysql.com/downloads/repo/apt/ 这里下…

Springboot整合Mybatis+Maven+Thymeleaf学生成绩管理系统

前言 该系统为学生成绩管理系统,可以当作学习参考,也可以成为Spirng Boot初学者的学习代码! 系统描述 学生成绩管理系统提供了三种角色:学生,老师,网站管理员。主要实现的功能如下: 登录 &a…

操作系统之文件系统

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

AG32:MCU和CPLD如何交互?

本文档介绍了AG32开发中,MCU与CPLD交互的具体方式以及例子。如需了解AG32更多资料可发邮件:salesagm-micro.com 一、MCU和CPLD直接交互 cpld工程创建及编译的操作流程,参考文档《AG32下fpga和cpld的使用入门》 在工程中,用户逻辑…

机器人轨迹跟踪控制——CLF-CBF-QP

本次使用MATLAB复现CLF-CBF-QP算法,以实现机器人轨迹跟踪同时保证安全性能 模型 使用自行车模型来进行模拟机器人的移动动态,具体的模型推导参考车辆运动学模型-自行车模型 采用偏差变量 p ~ = p − p r e f u ~ = u − u r e f \tilde{p} = p - p_{ref} \\ \tilde{u} = …

009_抽象类和接口

抽象类和接口 final关键字常量 单例模式(设计模式)枚举类抽象类抽象类的注意事项、特点使用抽象类的好处模版方法设计模式 接口接口的好处接口的注意事项 final关键字 final关键字是最终的意思,可以修饰类、方法、变量。 修饰类:…

新潮透明液体水珠水滴失真故障扭曲折射特效海报字体标题设计ps样机动作素材 Bubble Photoshop Templates

只需单击几下即可创建引人注目的视觉效果!您需要做的就是将您的文本或图像放入智能对象中并应用作。 包中包含: 15 个静态 Photoshop 模板(PS 2019 及更高版本) 01-05 垂直布局 (22504000)06-10 水平布局…

Android DiaLog全屏设置,带有叉号的弹窗,这个弹窗分为两个部分,一个是主体,另一个是关闭部分。自定义布局弹窗

1.先上图。要实现的效果图。 2.这是我自己实现的效果图,是不是跟效果图一摸一样 来看看整体效果 3.我把自己实现的效果图的代码写出来。如下就是我的代码 3.1首先是MainActivity类 import androidx.appcompat.app.AppCompatActivity;import android.app.Alert…

NVR接入录像回放平台用EasyCVR打造地下车库安防:大型商居安全优选方案

一、背景分析 随着居民生活品质的提升,大型商业建筑和住宅小区纷纷配套建设地下停车库。但是地下车库盗窃、失火、恶意毁坏车辆、外部人员随意进出等事件频发,部署视频监控系统成为保障地下车库的安全关键举措。 目前,很多商业和住宅都会在…

阶段测试 【过程wp】

分享总结: 回顾起来,真的感慨很多呀。看着并不难啊,但难的是解题思维:如何判断该页面的关键点,快速地确定问题的核心,找到对应的解决方法。达到便捷、高效的得到结果。我们做了整整近七个半小时。在这个过程中,我发现自己的思维钝化,不太能自主高效地划分判断漏洞类型,…

【C++】<STL部分>:STL标准模板库概要

STL(standard template libaray-标准模板库),是C标准库的重要组成部分,包含了很多常用的数据结构和算法。 在我们学习了模板的之后,再来看STL,就能知道它是C标准库中的模板类和模板函数的集合,作为可复用的库大大提高…

从传递函数到PID控制器

在过程控制中,按偏差的比例(P,Proportional)、积分(I,Integral)和微分(D,Differential)进行控制的PID控制器(亦称PID调节器)是应用最为…

【PVR Review】《A Review of Palmar Vein Recognition》

[1]张秀峰,牛选兵,王伟,等.掌静脉识别研究综述[J].大连民族大学学报,2020,22(01):33-37.DOI:10.13744/j.cnki.cn21-1431/g4.2020.01.007. 文章目录 1、背景2、手掌静脉识别方法2.1、传统手掌静脉图像识别方法2.2、基于深度学习的掌静脉图像识别 3、手掌静脉识别难点 1、背景 目…

vector复制耗时

CPP中的vector对象在传参给子函数时&#xff0c;如果直接传参&#xff0c;会造成复制给形参的额外耗时 如何解决这个问题呢&#xff1f; 这样定义局部函数 const vector <int>&vec可以保证传递vector对象时使用地址传递&#xff0c;并且使用const保证vector不被改变…

算法思想之双指针

文章目录 双指针字符串序列判定字符串所有整数最小和服务交换接口失败率分析分披萨最多团队 双指针 双指针是指在解决问题时使用两个指针&#xff0c;通常分别指向数组或字符串中的不同位置&#xff0c;通过移动这两个指针来解决问题的一种技巧。双指针技巧常用于解决数组、链…