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已经全部展开,外部点击删除的时候不需要重新展开点击获取下一层数据 <template> <el-treeref"tree":data"treeData":props"defaultProps"render-after-expandhighlight-currentlazy:expand-on-click-node&q…...
【PyQt5教程 四】Qt Designer 样式表(styleSheet)实现基本小部件的自定义动态效果和资源浏览器背景添加方法
目录 一、成果演示: 二、样式表的使用方法: (1)样式表语法和属性: (2)样式表代码示例: (3)伪类和状态: (4)复合选择器ÿ…...
【git】--- 通过 git 和 gitolite 管理单仓库的 SDK
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【git】--- 通过 git 和 gitolite 管理单仓库的 SDK 开发环境一、安装配置 gitolite二…...
计算机网络之NAT、代理服务、内网穿透、内网打洞
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之NAT、代理服务、内网穿透、内网打洞 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论…...
2024-金盾信安杯线上赛 WP
Misc 大赛宗旨 记事本打开,一眼零宽隐写 B 神工具一把梭,得到一串 base 编码 base64 解码得到 flag flag 值:flag{5d5555fa-1303-4b43-8eef-d6ea7c64c361} esab 根据题目 esab 可以发现这正是 base 的逆向,所以可以先逆向一下…...
MySQL 基础架构
MySQL的基础架构主要由三大核心部分构成,以下是详细的解析: 一、连接层 连接层是客户端与MySQL数据库之间的桥梁,主要负责通信和身份验证,确保数据交换的安全与稳定。具体来说,它负责以下任务: 建立连接…...
汽车升级到底应不应该设置“可取消“功能
最近,汽车OTA(Over-the-Air)升级频频成为车主讨论的热点。有些车主反映,一些升级增加了实用功能,而另一些却让体验变得复杂甚至带来不便。于是,大家不禁发问:汽车升级功能究竟应不应该允许“可取…...
【MySQL】mysql中的事务
目录 1、背景2、事务的特性3、事务之间的几种错误【1】脏读【2】不可重复读【3】幻读 4、事务中的隔离级别5、总结 1、背景 事务是存储引擎层面实现的,有的引擎支持事务,有的引擎不支持事务,我们常用的引擎InnoDB就支持事务,本文…...
大语言模型(LLM)与智能机器人的应用分析
系列文章目录 前言 近年来,大型语言模型(LLM)的集成彻底改变了机器人领域,使机器人能够以人类熟练程度进行交流、理解和推理。本文探讨了 LLM 对机器人的多方面影响,并针对在不同领域利用这些模型的关键挑战和机遇进行了研究。通过将 LLM 应用程序分类并分析核心机器人元素…...
Inno Setup 学习笔记(一)
前言 最近想把自己写的Windows端的软件打包成安装程序exe,又觉得自带的界面太丑了,想自己完全做一个新的页面 网上找到的只有基础教程,记录一下进阶学习过程 生命周期 按照Vue的说法叫生命周期,Inno Setup中叫 Pascal 脚本: 事…...
从阿里云EDM到美团云:典型微服务治理平台的实战经验分享
目录 一. 阿里云 EDM(Enterprise Distributed Application Service) 二. 腾讯云 TSF(Tencent Service Framework) 三. 华为云 FusionStage 四. 京东云 JDC(JD Cloud Microservice Platform) 五. 百度智…...
【接口自动化测试】一文从3000字从0到1详解接口测试用例设计
接口自动化测试是软件测试中的一种重要手段,它能有效提高测试效率和测试覆盖率。在进行接口自动化测试之前,首先需要进行接口测试用例的设计。本文将从0到1详细且规范的介绍接口测试用例设计的过程,帮助读者快速掌握这一技能。 一、了解接口…...
反向代理-缓存篇
文章目录 强缓存一、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.构造空表 2.插入 3.删除 4.定位 顺序表的优点: 顺序表的缺点: 例…...
JavaWeb学习、过滤器、ajax异步请求、json、jquery-api文档
一、过滤器: 按照过滤规则筛选出想要的资源。 为什么使用过滤器? 1. 很多地方都需要判断是否登录。如果我们在每个资源出进行判断,非常麻烦。我们可以使用过滤器在访问这些资源前进行判断。 (这样就不用在主界面,修改…...
深入探索 JVM:原理、机制与实战
一、JVM 概述 JVM(Java Virtual Machine)是 Java 程序运行的核心组件,它提供了一个独立于硬件和操作系统的执行环境,使得 Java 程序能够在不同平台上具有跨平台的特性。 JVM 主要由以下几部分组成: 类装载器…...
JavaWeb学习(3)(Servlet详细、Servlet的三种实现方式(面试)、Servlet的生命周期、传统web.xml配置Servlet(了解))
目录 一、Servlet详细。 (1)基本介绍。 (2)基本作用。 1、接收客户端请求数据。 2、处理请求。 3、完成响应结果。 二、Servlet的三种实现方式。 (1)实现javax.servlet.Servlet接口。 1、基本介绍。 2、代码…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
