当前位置: 首页 > news >正文

Oracle 数据库中SERIALLY_REUSABLE包是一种特殊的包类型

1、SERIALLY_REUSABLE 包概述

在 Oracle 数据库中,SERIALLY_REUSABLE包是一种特殊的包类型。这种包的目的是为了更有效地利用内存,特别是在高并发环境下。当一个会话调用SERIALLY_REUSABLE包中的过程或函数时,该包的状态(包括变量、游标等)在会话的调用之间可以被重复使用,而不是像普通包那样为每个会话单独维护一个状态副本。

2、显式游标(Explicit Cursors)在SERIALLY_REUSABLE包中的重要性

  • 资源管理角度:在SERIALLY_REUSABLE包中,显式游标用于精确地控制数据库资源的访问和分配。与隐式游标不同,显式游标允许开发人员明确地定义查询的范围、处理过程以及资源的释放时机。这在SERIALLY_REUSABLE包这种需要精细控制资源的环境中尤为重要,因为它可以避免不必要的资源占用和浪费。
  • 数据处理角度:显式游标提供了一种灵活的方式来处理返回多行数据的查询。在SERIALLY_REUSABLE包中,可能需要根据不同的条件和逻辑来遍历和处理查询结果。显式游标允许开发人员通过循环结构(如LOOP - FETCH - EXIT WHEN)逐行处理数据,这种细粒度的数据处理方式有助于实现复杂的业务逻辑。

3、定义和使用显式游标在SERIALLY_REUSABLE包中

  • 游标定义:在SERIALLY_REUSABLE包的规范(PACKAGE部分)或包体(PACKAGE BODY)中,可以像在普通的 PL/SQL 块中一样定义显式游标。例如:

     PACKAGE BODY my_serial_package ASCURSOR my_cursor ISSELECT column1, column2FROM my_tableWHERE condition;
    
  • 游标打开、提取和关闭:

    • 打开游标:在包的过程或函数中,可以使用OPEN命令打开游标。例如:

         PROCEDURE my_procedure ASBEGINOPEN my_cursor;-- 其他处理逻辑END;
      
    • 提取数据:打开游标后,可以使用FETCH命令逐行提取数据。例如:

      ```sqlPROCEDURE my_procedure ASv_column1 my_table.column1%TYPE;v_column2 my_table.column2%TYPE;BEGINOPEN my_cursor;LOOPFETCH my_cursor INTO v_column1, v_column2;EXIT WHEN my_cursor%NOTFOUND;-- 对提取的数据进行处理,如插入到其他表、进行计算等END LOOP;CLOSE my_cursor;END;
      ```
      
    • 关闭游标:在数据处理完成后,一定要使用CLOSE命令关闭游标,以释放资源。如果忘记关闭游标,可能会导致数据库资源(如内存和游标句柄)的浪费,并且在高并发环境下可能会影响系统性能。

4、注意事项和最佳实践

  • 游标共享和并发问题:在SERIALLY_REUSABLE包中,由于其可重复使用的特性,需要特别注意游标共享可能带来的并发问题。如果多个会话同时使用同一个游标,可能会出现数据不一致或资源竞争的情况。为了避免这种情况,可以考虑在包中添加适当的并发控制机制,如使用DBMS_LOCK包来实现锁机制,或者通过调整查询条件来确保每个会话获取到合适的数据。

  • 异常处理和游标状态:在处理游标过程中,应该包含完善的异常处理逻辑。如果在打开、提取或关闭游标时发生异常,可能会导致游标处于未定义的状态。例如,如果在提取数据时发生数据库错误,应该及时关闭游标,以避免资源泄漏。可以使用EXCEPTION块来捕获和处理这些异常,例如:

     PROCEDURE my_procedure ASv_column1 my_table.column1%TYPE;v_column2 my_table.column2%TYPE;BEGINOPEN my_cursor;LOOPFETCH my_cursor INTO v_column1, v_column2;EXIT WHEN my_cursor%NOTFOUND;-- 对提取的数据进行处理,如插入到其他表、进行计算等END LOOP;CLOSE my_cursor;EXCEPTIONWHEN OTHERS THENIF my_cursor%ISOPEN THENCLOSE my_cursor;END IF;-- 重新抛出异常或者进行其他错误处理RAISE;END;
    
  • 性能优化:在SERIALLY_REUSABLE包中使用显式游标时,也需要考虑性能优化。可以通过合理设计查询语句(如添加适当的索引来提高查询速度)、控制游标提取的行数(避免一次性提取过多数据)等方式来提高游标操作的性能。同时,对于经常使用的游标,可以考虑将其缓存起来,以减少游标打开和关闭的开销。

5、示例

DROP TABLE t_people;
CREATE TABLE t_people (id number primary key,name VARCHAR2(20));INSERT INTO t_people (id,name) VALUES (1,'John Smith');
INSERT INTO t_people (id,name) VALUES (2,'Mary Jones');
INSERT INTO t_people (id,name) VALUES (3,'Joe Brown');
INSERT INTO t_people (id,name) VALUES (4,'Jane White');
commit;
-- 查看表数据
select * from t_people;
TESTUSER@FREEPDB1>ID NAME
---------- ------------------------------------------------------------1 John Smith2 Mary Jones3 Joe Brown4 Jane White
-- 创建包sr_pkg 
CREATE OR REPLACE PACKAGE sr_pkg ISPRAGMA SERIALLY_REUSABLE;CURSOR c IS SELECT name FROM t_people;
END sr_pkg;
/
-- 创建存储过程 
CREATE OR REPLACE PROCEDURE fetch_from_cursor ISv_name  t_people.name%TYPE;
BEGINIF sr_pkg.c%ISOPEN THENDBMS_OUTPUT.PUT_LINE('Cursor is open.');ELSEDBMS_OUTPUT.PUT_LINE('Cursor is closed; opening now.');OPEN sr_pkg.c;END IF;FETCH sr_pkg.c INTO v_name;DBMS_OUTPUT.PUT_LINE('Fetched: ' || v_name);FETCH sr_pkg.c INTO v_name;DBMS_OUTPUT.PUT_LINE('Fetched: ' || v_name);END fetch_from_cursor;
/

First call to server:

BEGINfetch_from_cursor;fetch_from_cursor;
END;
/
-- 返回执行结果
Cursor is closed; opening now.
Fetched: John Smith
Fetched: Mary Jones
Cursor is open.
Fetched: Joe Brown
Fetched: Jane White

New call to server:

BEGINfetch_from_cursor;fetch_from_cursor;
END;
/Cursor is closed; opening now.
Fetched: John Smith
Fetched: Mary Jones
Cursor is open.
Fetched: Joe Brown
Fetched: Jane White

相关文章:

Oracle 数据库中SERIALLY_REUSABLE包是一种特殊的包类型

1、SERIALLY_REUSABLE 包概述 在 Oracle 数据库中,SERIALLY_REUSABLE包是一种特殊的包类型。这种包的目的是为了更有效地利用内存,特别是在高并发环境下。当一个会话调用SERIALLY_REUSABLE包中的过程或函数时,该包的状态(包括变量…...

css基础记录

基础 选择器 复合选择器 后代选择器 div p {}; 类似如上,找到div中所有的后代,注意是所有的后代 子代选择器 > div > a 只选择div的儿子中有a的 并集选择器 用逗号,分隔 p,div,span,h1 { … } 一般一行写一个 CSS元素显示模式 分为块元素,行内元素 块元素 特点…...

Python后端 -- 万字长文全面解析Django框架

自从2005年诞生以来,Django因其“开发速度快、安全性高”的特点迅速成为许多开发者的首选。无论是小型的个人项目,还是大型的企业应用,Django都能游刃有余地满足需求。我们将从Django的基础知识带你全面掌握Django,从基础知识到高…...

el-thee懒加载删除某条数据 ,el-thee懒加载重置,el-thee刷新某个节点

一、懒加载的tree已经全部展开&#xff0c;外部点击删除的时候不需要重新展开点击获取下一层数据 <template> <el-treeref"tree":data"treeData":props"defaultProps"render-after-expandhighlight-currentlazy:expand-on-click-node&q…...

【PyQt5教程 四】Qt Designer 样式表(styleSheet)实现基本小部件的自定义动态效果和资源浏览器背景添加方法

目录 一、成果演示&#xff1a; 二、样式表的使用方法: &#xff08;1&#xff09;样式表语法和属性&#xff1a; &#xff08;2&#xff09;样式表代码示例&#xff1a; &#xff08;3&#xff09;伪类和状态&#xff1a; &#xff08;4&#xff09;复合选择器&#xff…...

【git】--- 通过 git 和 gitolite 管理单仓库的 SDK

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【git】--- 通过 git 和 gitolite 管理单仓库的 SDK 开发环境一、安装配置 gitolite二…...

计算机网络之NAT、代理服务、内网穿透、内网打洞

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之NAT、代理服务、内网穿透、内网打洞 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论…...

2024-金盾信安杯线上赛 WP

Misc 大赛宗旨 记事本打开&#xff0c;一眼零宽隐写 B 神工具一把梭&#xff0c;得到一串 base 编码 base64 解码得到 flag flag 值&#xff1a;flag{5d5555fa-1303-4b43-8eef-d6ea7c64c361} esab 根据题目 esab 可以发现这正是 base 的逆向&#xff0c;所以可以先逆向一下…...

MySQL 基础架构

MySQL的基础架构主要由三大核心部分构成&#xff0c;以下是详细的解析&#xff1a; 一、连接层 连接层是客户端与MySQL数据库之间的桥梁&#xff0c;主要负责通信和身份验证&#xff0c;确保数据交换的安全与稳定。具体来说&#xff0c;它负责以下任务&#xff1a; 建立连接…...

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…...

【MySQL】mysql中的事务

目录 1、背景2、事务的特性3、事务之间的几种错误【1】脏读【2】不可重复读【3】幻读 4、事务中的隔离级别5、总结 1、背景 事务是存储引擎层面实现的&#xff0c;有的引擎支持事务&#xff0c;有的引擎不支持事务&#xff0c;我们常用的引擎InnoDB就支持事务&#xff0c;本文…...

大语言模型(LLM)与智能机器人的应用分析

系列文章目录 前言 近年来,大型语言模型(LLM)的集成彻底改变了机器人领域,使机器人能够以人类熟练程度进行交流、理解和推理。本文探讨了 LLM 对机器人的多方面影响,并针对在不同领域利用这些模型的关键挑战和机遇进行了研究。通过将 LLM 应用程序分类并分析核心机器人元素…...

Inno Setup 学习笔记(一)

前言 最近想把自己写的Windows端的软件打包成安装程序exe&#xff0c;又觉得自带的界面太丑了&#xff0c;想自己完全做一个新的页面 网上找到的只有基础教程&#xff0c;记录一下进阶学习过程 生命周期 按照Vue的说法叫生命周期&#xff0c;Inno Setup中叫 Pascal 脚本: 事…...

从阿里云EDM到美团云:典型微服务治理平台的实战经验分享

目录 一. 阿里云 EDM&#xff08;Enterprise Distributed Application Service&#xff09; 二. 腾讯云 TSF&#xff08;Tencent Service Framework&#xff09; 三. 华为云 FusionStage 四. 京东云 JDC&#xff08;JD Cloud Microservice Platform&#xff09; 五. 百度智…...

【接口自动化测试】一文从3000字从0到1详解接口测试用例设计

接口自动化测试是软件测试中的一种重要手段&#xff0c;它能有效提高测试效率和测试覆盖率。在进行接口自动化测试之前&#xff0c;首先需要进行接口测试用例的设计。本文将从0到1详细且规范的介绍接口测试用例设计的过程&#xff0c;帮助读者快速掌握这一技能。 一、了解接口…...

反向代理-缓存篇

文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…...

【伪代码】数据结构-期末复习 线性表

目录 例1 矩阵相乘 线性表 2.1 线性表的类型定义 例2-1 求并集 LALA∪LB 例2-2 有序表归并 2. 2 线性表的顺序表示和实现 1&#xff0e;构造空表 2&#xff0e;插入 3&#xff0e;删除 4&#xff0e;定位 顺序表的优点&#xff1a; 顺序表的缺点&#xff1a; 例…...

JavaWeb学习、过滤器、ajax异步请求、json、jquery-api文档

一、过滤器&#xff1a; 按照过滤规则筛选出想要的资源。 为什么使用过滤器&#xff1f; 1. 很多地方都需要判断是否登录。如果我们在每个资源出进行判断&#xff0c;非常麻烦。我们可以使用过滤器在访问这些资源前进行判断。 &#xff08;这样就不用在主界面&#xff0c;修改…...

深入探索 JVM:原理、机制与实战

一、JVM 概述 JVM&#xff08;Java Virtual Machine&#xff09;是 Java 程序运行的核心组件&#xff0c;它提供了一个独立于硬件和操作系统的执行环境&#xff0c;使得 Java 程序能够在不同平台上具有跨平台的特性。 JVM 主要由以下几部分组成&#xff1a; 类装载器&#xf…...

JavaWeb学习(3)(Servlet详细、Servlet的三种实现方式(面试)、Servlet的生命周期、传统web.xml配置Servlet(了解))

目录 一、Servlet详细。 &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;基本作用。 1、接收客户端请求数据。 2、处理请求。 3、完成响应结果。 二、Servlet的三种实现方式。 &#xff08;1&#xff09;实现javax.servlet.Servlet接口。 1、基本介绍。 2、代码…...

支付宝租赁小程序助力便捷生活新方式

内容概要 支付宝租赁小程序为现代人带来了许多惊喜&#xff0c;它不仅仅是一个简单的租赁平台&#xff0c;更是生活中不可或缺的好帮手。想象一下&#xff0c;无论你缺少什么&#xff0c;从工具到家居用品&#xff0c;只需轻轻一点&#xff0c;便能轻松找到需要的物品。这个小…...

Linux-ubuntu环境配置

一&#xff0c;安装VWware&#xff0c;里面导入镜像文件 这些都是文件夹里面有的&#xff0c;然后对着正点原子视频安装就行&#xff0c;虚拟机的破解码&#xff0c;去百度搜一个能用就行&#xff0c;中间遇见俩问题。①乌班图里面不能上网&#xff0c;②插入U盘后&#xff0c;…...

深入解析下oracle的number底层存储格式

oracle数据库中&#xff0c;number数据类型用来存储数值数据&#xff0c;它既可以存储负数数值&#xff0c;也可以存储正数数值。相对于其他类型数据&#xff0c;number格式的数据底层存储格式要复杂得多。今天我们就详细探究下oracle的number底层存储格式。 一、环境搭建 1.…...

nginx代理rabbitmq和配置 Nginx 代理达梦数据库

在 Nginx 中使用 stream 模块进行 TCP 代理时&#xff0c;可以将 TCP 或 UDP 流量转发到指定的后端服务器。你给出的配置是一个用于代理 RabbitMQ 的示例&#xff0c;具体是在 TCP 层上代理 5672 端口的流量。 只能在nginx.conf配置上代理 stream {# 定义 upstream&#xff0c…...

汉语唤醒词的模糊判断(Python)

汉语唤醒词的模糊判断【Python】 说明安装库代码Demo其他 说明 这是一个简单的汉语模糊唤醒词的判断器&#xff0c;汉语发音中前后舌以及声母韵母的区别&#xff0c;如果进行精准判断&#xff0c;很容易误判。需要一个模糊判断的逻辑! 安装库 pip install pypinyin代码Demo …...

Redis篇-2--原理篇1--I/O多路复用机制(5种I/O模型,I/O多路复用)

I/O多路复用机制&#xff1a; Redis 是通过I/O多路复用机制来管理大量客户端连接。这使得redis可以实现通过单线程来处理多个客户端连接的请求&#xff0c;避免了为每个客户端创建独立的线程&#xff0c;从而减少了上下文切换的开销&#xff0c;提高了系统的并发性和性能。 理解…...

Knowledge Graph Studio:让知识图谱构建更简单、更智能

一、前言 上周和研究院的同事讨论 2025 年大模型产品规划时&#xff0c;让我产生了一些疑惑和不解&#xff0c;因为从大家交流的规划方向来看&#xff0c;更多的还是集中在Prompt提示词工程&#xff08;包括提示词的管理、测试、评估、调优&#xff09;这一块规划的确实挺细&a…...

vue 中实现音视频播放进度条(可拖拽,满足常见开发需求)

由于开发需要&#xff0c;作者封装了一个音视频播放进度条的组件&#xff0c;支持 vue2 及 vue3 &#xff0c;有需要的朋友后台私信作者获取组件源码哦&#xff08;工作日每天都在线&#xff09;&#xff0c;下面是对该款组件的介绍。 组件默认样式&#x1f447;&#xff08;组…...

[免费]SpringBoot+Vue企业OA自动化办公管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue企业OA自动化办公管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue企业OA自动化办公管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入…...

笔记:在WPF中BitmapSource都有哪些派生类,他们主要功能,使用方法,使用场景

一、目的&#xff1a;在WPF中BitmapSource都有哪些派生类&#xff0c;他们主要功能&#xff0c;使用方法&#xff0c;使用场景 BitmapSource 是 WPF 中图像处理的基类&#xff0c;提供了许多派生类来处理不同类型的图像源。以下是一些常见的 BitmapSource 派生类、它们的主要功…...

电子商务网站建设花费/关键词挖掘工具

hello 我是涤生,以下为笔者自己见解&#xff0c;如有错误&#xff0c;请大家务必指出&#xff0c;谢谢♪(&#xff65;ω&#xff65;)&#xff89; 首先来说说 int main() 、void main()、void main(void)这几个吧 以前我也不知道这为什么&#xff0c;上网一搜&#xff0c;好…...

简单易做的网站/个人网页设计作品模板

湘潭大学的EDA课程设计,可直接通过用VHDL设计交通灯控制器图a是一个十字路口交通灯控制示意图&#xff0c;H公路和V公路在路口各有两个红绿灯指示道路通行状况。图a 十字路口交通灯控制示意图对应图a的交通灯控制器&#xff0c;拟用VHDL语言设计一电路模拟其控制逻辑&#xff0…...

网站建设 教程/百度关键词怎么优化

Arduino开发环境搭建 获取Arduino IDE开发工具 下载地址 &#xff1a;http://arduino.cc/en/Main/Software 可以下载release 版、Beta版和前期版本 Arduino的开发性&#xff0c;支持源码下载 支持的平台有 Windows、MAC OS X、Linux Windows 平台上面 Arduino IDE下载后为zip包…...

wordpress充值功能/怎么制作网页链接

2020中甲联赛第二阶段第一轮&#xff0c;冲超组成都赛区成都兴城人居队的唐淼、保级1组梅州赛区贵州恒丰队的马格利卡、保级2组常州赛区呼和浩特队的奥古斯托&#xff0c;三人当选最佳球员。成都兴城人居 19号 唐淼位置&#xff1a;前卫 年龄&#xff1a;30本轮与老对手泰州远…...

南昌比较好的网站设计/网站seo收录工具

springBoot的2.x版本与springCloud的H版本 版本对应关系&#xff1a;版本查看地址...

济南做网站个人/商丘seo博客

[通讯]如何设置集团电话的等级? (集团电话的具体型号忘了汗 好像是 180I )客户要求分机号为826的电话 可以打出国际长途和国内长途,原来只可以打市话。注明一点,这里的编程必须使用专用话机才可以第一步首先按“转换”键&#xff0c;输入800(设定编程代码)&#xff0c;再输入…...