【Oracle】Oracle系列之十三--游标

文章目录

  • 往期回顾
  • 前言
  • 1. 游标的定义
  • 2. 游标的类型
    • (1)显式游标
    • (2)隐式游标
  • 3. 游标的应用
    • (1)基本用法
    • (2)数据处理
    • (3)更新数据
    • (4)注意事项

往期回顾

  • 【Oracle】Oracle系列之一–Oracle数据类型
  • 【Oracle】Oracle系列之二–Oracle数据字典
  • 【Oracle】Oracle系列之三–Oracle字符集
  • 【Oracle】Oracle系列之四–用户管理
  • 【Oracle】Oracle系列之五–Oracle表空间
  • 【Oracle】Oracle系列之六–Oracle表分区
  • 【Oracle】Oracle系列之七–表的创建与管理
  • 【Oracle】Oracle系列之八–SQL查询
  • 【Oracle】Oracle系列之九–Oracle常用函数
  • 【Oracle】Oracle系列之十–Oracle正则表达式
  • 【Oracle】Oracle系列之十一–PL/SQL
  • 【Oracle】Oracle系列之十二–视图、记录、同义词、序列

前言

1. 游标的定义

Oracle游标(cursor)是一种数据结构,用于在PL/SQL代码中处理结果集,如用于暂时存储SELECT语句返回的结果集。游标允许程序员对结果集进行逐行处理,并在需要时检索或修改数据。当表的数据量很大的时候,不适合使用游标。

使用游标的5个步骤:

  • 声明变量,用于保存SELECT语句返回的值。
  • 声明游标,并指定SELECT语句。
  • 使用OPEN语句打开游标。
  • 通过FETCH语句从游标中获取记录。
  • 通过CLOSE语句关闭游标。

e.g.

DECLARE
MYRECORD employees%ROWTYPE;  /*声明变量*/
CURSOR MYCUR IS
SELECT * FROM employees;  /*声明游标*/
BEGIN
OPEN MYCUR;                    /*打开游标*/
LOOP
FETCH MYCUR INTO MYRECORD;  /*从游标中获取记录*/
DBMS_OUTPUT.PUT_LINE (MYRECORD.NAME||','||MYRECORD.BIRTH);
EXIT WHEN MYCUR%NOTFOUND;
END LOOP;
CLOSE MYCUR;                   /*关闭游标*/
END;

2. 游标的类型

Oracle支持两种类型的游标:显式游标和隐式游标。显式游标是由程序员明确声明和定义的游标,而隐式游标则由Oracle自动创建并使用。

(1)显式游标

显式游标由程序员明确声明和定义,可以更好地控制游标的行为。它们可以在PL/SQL代码中使用,允许程序员检索结果集、逐行处理数据并在需要时修改数据。

e.g.

DECLARECURSOR c1 IS SELECT * FROM employees WHERE department_id = 10;v_emp employees%ROWTYPE;
BEGINOPEN c1;LOOPFETCH c1 INTO v_emp;EXIT WHEN c1%NOTFOUND;-- 处理v_emp这一行数据END LOOP;CLOSE c1;
END;

上述示例中,游标c1选择了名为employees的表中部门ID为10的所有记录。FETCH语句将每行数据逐个存储在v_emp变量中进行逐行处理。如果没有更多的行,则EXIT语句退出循环并关闭游标。

(2)隐式游标

隐式游标是由Oracle自动创建和维护的游标。它们用于在SQL语句中处理结果集而不需要显式声明和定义。

e.g.

BEGINFOR v_emp IN (SELECT * FROM employees WHERE department_id = 10) LOOP-- 处理v_emp这一行数据END LOOP;
END;

上述示例中,FOR循环使用SELECT语句选择名为employees的表中部门ID为10的所有记录。在循环期间,每个行都存储在v_emp变量中进行逐行处理。

虽然隐式游标不需要显式声明和定义,但它们可以更容易地引起错误,例如可能会影响其他同时执行的操作或导致内存泄漏等问题。因此,编写复杂业务逻辑的PL/SQL代码时,应该优先考虑使用显式游标。

3. 游标的应用

(1)基本用法

游标最基本的用法就是遍历查询结果集,游标也可以带参数,参数只声明类型,不声明精度。

e.g.

DECLARE
T_NAME employees%TYPE;
CURSOR CUR_PARA(MCC VARCHAR2) IS
SELECT MC FROM employees WHERE AREA=MCC;
BEGIN
OPEN CUR_PARA('北京市');
LOOP
FETCH CUR_PARA INTO T_NAME;
EXIT WHEN CUR_PARA%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(T_NAME);
END LOOP;
CLOSE CUR_PARA;
END;

(2)数据处理

游标可通过循环实现复杂的数据处理业务逻辑。

e.g.

DECLARE
CURSOR c_emp IS SELECT * FROM emp;
v_sum NUMBER := 0;
v_sal emp.sal%TYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp;
EXIT WHEN c_emp%NOTFOUND;
v_sal := v_emp.sal;
v_sum := v_sum + v_sal;
END LOOP;
CLOSE c_emp;
DBMS_OUTPUT.put_line('The total salary is ' || v_sum);
END;

上述代码通过定义游标c_emp查询emp表中的所有记录,并通过循环遍历每条记录,对员工薪资进行累加求和,并最后输出结果。

(3)更新数据

除了查询和读取外,游标还可以对查询结果进行更新和删除。

e.g.

DECLARE
CURSOR c_emp IS SELECT * FROM emp WHERE job = 'MANAGER' AND deptno = 10 FOR UPDATE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp;
EXIT WHEN c_emp%NOTFOUND;
UPDATE emp SET sal = sal * 1.1 WHERE CURRENT OF c_emp;
END LOOP;
CLOSE c_emp;
END;

上述代码通过定义游标c_emp查询emp表中部门编号为10且职位为经理的员工记录,并使用FOR UPDATE语句锁定这些记录,以免其他用户对其进行修改。接着,通过循环遍历每条记录,并对每条记录的薪资进行10%的涨幅更新。最后,通过CLOSE语句关闭游标。

(4)注意事项

使用游标时需注意以下问题:

游标的性能问题:由于游标需要逐条读取查询结果集中的数据,因此在处理大量数据时可能会引起性能问题。为了优化游标的性能,可以通过增加WHERE子句、使用索引和减少JOIN等方式来缩小查询结果集。
游标的内存占用:游标需要占用一定的内存空间,因此在处理大量数据时需要格外注意内存的占用情况。为避免内存溢出,可以通过设置游标缓存大小、使用LIMIT关键字和增加WHERE子句等方式来限制查询结果集的大小。
游标的并发控制:由于游标在处理数据时需要锁定查询结果集中的记录,因此在并发环境下需要格外注意对游标的并发控制。为避免死锁等问题,可以通过合理的锁机制和事务管理来保证游标的并发稳定性。

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

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

相关文章

打造完美家庭空间,让生活更加舒适

在现代繁忙的都市生活中,家是人们温暖而舒适的避风港。而如何打造一个恰到好处的家庭空间,成为了许多人心中的追求。今天,就让我们来探索一些空间布局方案,为您的家庭营造一个完美融合功能与美感的舒适空间。 🏠&…

javaee之Elasticsearch相关知识

简单说一下Elasticsearch相关知识 其余的参考官网文档 我们还可以用下面的方式来查 看一下原始索引库的模板 下面看一下数据库映射关系 下面就是更改了id1的所有数据 下面是我索引库中的内容 说一下查询之后,一些属性的含义 上面案例是这样理解的 match查询类型会对…

windows redis 自启动 Redis服务无法启动报错1067问题

如果你的系统服务里面已经有redis服务并且无法启动,则使用下面的命令卸载此服务 ! 1、停止Redis服务: redis-server --service-uninstall 2、删除系统服务 sc delete redis 进入到你的Redis安装目录,我的在以下目录,谨记此时不…

【UE】在游戏运行时,通过选择uasset来生成静态网格体

目录 主要流程 步骤 一、创建用于包含静态网格体的Actor蓝图 二、按钮点击事件 效果 主要流程 用户点击按钮后产生一个文件对话框,用户通过文件对话框选择指定的文件夹,我们获取到这个文件夹路径后处理成“按路径获取资产”节点所需的输入&#x…

学习总结1

Vue的学习 Vue是一套用于构建用户界面的渐进式JavaScript框架; Vue中关键的几个概念:组件化,MVVM,响应式,和生命周期。 1. 组件化: 在Vue框架中,允许你将界面拆分为小的,独立的可…

starrocks启动和停止和重启脚本

StarRocks启动和停止和重启脚本 编辑脚本:vim start_stop_starrocks.sh 备注:IP修改为自己的IP即可 #!/bin/bashcase $1 in "start"){for i in 12.3.7.147 12.3.7.148 12.3.7.149 12.3.7.150doecho " --------启动 $i be -------"ssh $i &qu…

node.js知识系列(1)-每天了解一点

目录 1. Node.js 是什么以及其主要特点2. 事件循环(Event Loop)和其作用3. 处理回调地狱(Callback Hell)4. 包管理器和 npm5. 模块系统和导入/导出模块6. 文件操作7. 事件发射器(EventEmitter)8. 处理异常和…

Vue3+TypeScript

一、Vue3带来的变化(源码) 源码通过monorepo的形式来管理源代码 口Mono:单个 口Repo : repository仓库 口主要是将许多项目的代码存储在同一个repository中; 口这样做的目的是多个包本身相互独立,可以有自己的功能逻辑、单元测试等,同时又在…

【数据库开发】DQL操作和多表设计

数据库开发 一、数据库操作-DQL 1.概述 用来查询数据库表中的记录,查询操作分为两部分,单表操作和多表操作,针对于查询而言(相较于增删改更加的灵活)基于目标分析条件转换为SQL语句 2.语法 SELECT 字段列表 FROM表…

基于安卓android微信小程序的旅游app系统

项目介绍 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.自助定制游将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本…

Java线程池:并发编程的利器

Java线程池:并发编程的利器 在多任务、高并发的时代,Java并发编程显得尤为重要。其中,Java线程池是一种高效的管理线程的工具,能够提高应用程序的性能和响应速度。本文将深入探讨Java线程池的工作原理、应用场景以及简单示例&…

SpringBoot整合POI实现Excel文件读写操作

1.环境准备 1、导入sql脚本: create database if not exists springboot default charset utf8mb4;use springboot;create table if not exists user (id bigint(20) primary key auto_increment comment 主键id,username varchar(255) not null comment 用…

10.5 认识XEDParse汇编引擎

XEDParse 是一款开源的x86指令编码库,该库用于将MASM语法的汇编指令级转换为对等的机器码,并以XED格式输出,目前该库支持x86、x64平台下的汇编编码,XEDParse的特点是高效、准确、易于使用,它可以良好地处理各种类型的指…

学习笔记(css穿透、vue-cookie、拦截器、vuex、导航守卫、token/Cookie、正则校验)

目录 一、记录 1、CSS穿透 2、输入框是否提示输入 3、插槽 #slot 4、v-deep深入改掉属性值 二、vue-cookie 1、官方文档 2、使用 三、拦截器 1、请求拦截器 2、响应拦截器 四、vuex对信息存取改 五、路由导航守卫 1、登录思路 2、设置白名单 六、Token与Cookie…

蓝桥杯每日一题2023.9.30

蓝桥杯大赛历届真题 - C&C 大学 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于此题,首先想到了dfs进行一一找寻,注意每次不要将重复的算进去,故我们每次循环可以记录一个开始的位置,下一次到这个位置时,…

WIFI频段

问题: 5ghzwifi频段带宽怎么选 智造喵回答: 选择5GHz WiFi频段的带宽取决于你的网络需求和设备兼容性。通常有两种可选的带宽:20MHz和40MHz。 20MHz带宽:这是较为常见的 WiFi 频段带宽设置。它提供较好的穿墙能力和信号稳定性…

【MySQL基础】概述、DDL和DML

MySQL基础 1.MySQL概述 安装 MySQL官方提供了两个版本: 商业版本(MySQL Enterprise Edition) 该版本是收费的,可以使用30天。 官方会提供对应的技术支持。 社区版本(MySQL Community Server) 该版本是免费…

【数据结构-二叉树 九】【树的子结构】:树的子结构

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【子结构】,使用【二叉树】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

软考程序员考试大纲(2023)

文章目录 前言一、考试说明1.考试目标2.考试要求3.考试科目设置 二、考试范围考试科目1:计算机与软件工程基本知识1.计算机科学基础2.计算机系统基础知识3.系统开发和运行知识4.网络与信息安全基础知识5&am…

WebKit Inside: CSS 样式表的匹配时机

WebKit Inside: CSS 的解析 介绍了 CSS 样式表的解析过程,这篇文章继续介绍 CSS 的匹配时机。 无外部样式表 内部样式表和行内样式表本身就在 HTML 里面,解析 HTML 标签构建 DOM 树时内部样式表和行内样式就会被解析完毕。因此如果 HTML 里面只有内部样式…