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.

DECLARE
  CURSOR c1 IS SELECT * FROM employees WHERE department_id = 10;
  v_emp employees%ROWTYPE;
BEGIN
  OPEN c1;
  LOOP
    FETCH 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.

BEGIN
  FOR 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)注意事项

使用游标时需注意以下问题:文章来源地址https://www.toymoban.com/news/detail-469549.html

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

到了这里,关于Oracle系列十三:游标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL游标(cursor)定义及使用

    提到MySQL游标,多半在存储过程中定义及使用。 以下说明摘自MySQL官网: MySQL 支持存储程序中的游标。语法与嵌入式 SQL 中的一样。游标具有以下属性: 不敏感:服务器可能会也可能不会复制其结果表 只读:不可更新 不可滚动:只能单向遍历,不能跳行 游标声明必须出现在

    2023年04月27日
    浏览(25)
  • 玩转Mysql系列 - 第19篇:游标详解

    这是Mysql系列第19篇。 环境:mysql5.7.25,cmd命令中进行演示。 代码中被[]包含的表示可选,|符号分开的表示可选其一。 需求背景 当我们需要对一个select的查询结果进行遍历处理的时候,如何实现呢? 此时我们需要使用游标,通过游标的方式来遍历select查询的结果集,然后对

    2024年02月09日
    浏览(32)
  • 存储过程、触发器、游标、视图、自定义函数 字段类型、字段可空、统计字段、逻辑删除 权限系统数据库&无限极类别设计

    在数据库设计中,存储过程、触发器、游标、视图、自定义函数、字段类型、字段可空、统计字段、逻辑删除以及权限系统和无限级类别设计都是重要的概念。下面我将逐一解释这些概念,并提供相关的设计建议。 存储过程 (Stored Procedure) 定义 :存储过程是一组为了完成特定

    2024年03月09日
    浏览(87)
  • 简单的股票行情演示(一) - 实时标的数据

    一、概述 二、效果展示 三、实现代码 1、行情数据中心 2、数据拉取模块 3、基础服务模块 4、UI展示 四、相关文章 原文链接: 简单的股票行情演示(一) - 实时标的数据 很长一段时间都有一个想法,使用QCP去做一个行情展示小事例,一直没有着手开发的原因主要是行情数据

    2024年02月11日
    浏览(24)
  • 非两融标的可以做场外个股期权吗?怎么询价?

    场外个股期权对应的标的毫无疑问就是可以两融的股票。换句话说就是投资者觉得未来这只票可能大概率上涨,同时又有放杠杆的需求,那场外个股期权可以是个不错的选择,下文介绍非两融标的可以做场外个股期权吗?怎么询价? 本文来自:期权酱 一、什么是场外个股期权

    2024年02月06日
    浏览(35)
  • HarmonyOS(十三)——详解自定义组件的生命周期

    自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。 下图展示的是被@Entry装饰的组件生命周期: 今天根据上面的流程图,我们从自定义组件

    2024年01月25日
    浏览(40)
  • 【vue2第十三章】自定义指令 自定义v-loading指令

    像 v-html,v-if,v-for都是vue内置指令,而我们也可以封装自定义指令,提升编码效率。 什么是自定义指令? 自己定义的一些指令,可以进行一些dom操作,扩展格外的功能。比如让图片懒加载,让input自动聚焦。 自定义指令又分为全局注册和局部注册。 使用方法则是与内置指令

    2024年02月09日
    浏览(33)
  • Python工具箱系列(三十三)

    Timescaledb 在物联网时代,出现了大量以时间为中心海量产生的传感器数据,称为时序数据。这类数据的特点是: 数据记录总有一个时间戳。 数据几乎总是追加,不更新也不删除。 大量使用近期的数据。很少更新或者回填时间间隔的缺失数据。 与时间间隔频率关系不大。但累

    2024年02月06日
    浏览(44)
  • 【微信小程序】-- 自定义组件 -- 数据、方法和属性(三十三)

    💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘   大家好,又见面了,

    2024年02月09日
    浏览(29)
  • Android最火的框架系列(十三)MpAndroidChart

        本系列篇主要介绍下Android非常火爆的三方图表库MpAndroidChart的使用。可能在大多数情况下,我们很少会在Android端去开发图表,一般情况下图表都会在PC端用H5去展示。但如果说做一些金融财经类、工厂类、统计类、大数据类等的app,肯定会涉及到到数据可视化分析,那么

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包