Oracle】PL/SQL 显式游标、隐式游标、动态游标

Oracle数据库数据编程SQL<3.3 PL/SQL 游标>  游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制,它允许开发者逐行处理SQL语句返回的数据。游标是一个指向上下文区域的指针,用于处理SQL语句的执行结果。它提供了以下能力:逐行访问结果集跟踪当前处理的行对结果集进行修改或删除操作 阅读详情

在PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。

在每个用户会话中,可以同时打开多个游标,其数量由数据库初始化参数文件中的OPEN_CURSORS参数定义。

处理显式游标


    DECLARE  
       CURSOR c4(dept_id NUMBER, j_id VARCHAR2) --1、声明游标,有参数没有返回值  
       IS  
          SELECT first_name f_name, hire_date FROM employees  
          WHERE department_id = dept_id AND job_id = j_id;  
      
        --基于游标定义记录变量,比声明记录类型变量要方便,不容易出错  
        v_emp_record c4%ROWTYPE;  
    BEGIN  
       OPEN c4(90, 'AD_VP');             --2、打开游标,传递参数值  
       LOOP  
          FETCH c4 INTO v_emp_record;    --3、提取游标fetch into  
          IF c4%FOUND THEN  
             DBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇佣日期是'  
                                ||v_emp_record.hire_date);  
          ELSE  
             DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');  
             EXIT;  
          END IF;  
       END LOOP;  
       CLOSE c4;                         --4、关闭游标  
    END;  

退出LOOP或者用:

EXIT WHEN c4%NOTFOUND;

游标属性:

Cursor_name%FOUND 布尔型属性,当最近一次提取游标操作FETCH成功则为 TRUE,否则为FALSE;

Cursor_name%NOTFOUND 布尔型属性,与%FOUND相反;——注意区别于DO_DATA_FOUND(select into抛出异常)

Cursor_name%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;
Cursor_name%ROWCOUNT 数字型属性,返回已从游标中读取的记录数。
游标的for循环

PL/SQL语言提供了游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能;

当进入循环时,游标FOR循环语句自动打开游标,并提取第一行游标数据;
当程序处理完当前所提取的数据而进入下一次循环时,游标FOR循环语句自动提取下一行数据供程序处理;
当提取完结果集合中的所有数据行后结束循环,并自动关闭游标。

格式:
FOR index_variable IN cursor_name[(value[, value]…)] LOOP
– 游标数据处理代码
END LOOP;

其中:

index_variable为游标FOR 循环语句隐含声明的索引变量,该变量为记录变量,其结构与游标查询语句返回的结构集合的结构相同。在程序中可以通过引用该索引记录变量元素来读取所提取的游标数据,index_variable中各元素的名称与游标查询语句选择列表中所制定的列名相同。如果在游标查询语句的选择列表中存在计算列,则必须为这些计算列指定别名后才能通过游标FOR 循环语句中的索引变量来访问这些列数据。

DECLARE  
  CURSOR c_cursor(dept_no NUMBER DEFAULT 10)   
  IS  
    SELECT department_name, location_id FROM departments WHERE department_id <= dept_no;  
BEGIN  
    --当dept_no参数值为30  
    FOR c1_rec IN c_cursor(30) LOOP          
         DBMS_OUTPUT.PUT_LINE(c1_rec.department_name||'---'||c1_rec.location_id);  
    END LOOP;  
     
    --使用默认的dept_no参数值10  
    FOR c1_rec IN c_cursor LOOP         
         DBMS_OUTPUT.PUT_LINE(c1_rec.department_name||'---'||c1_rec.location_id);  
    END LOOP;  
END;  

更新或删除当前游标数据

游标查询语句中必须使用FOR UPDATE选项,以便在打开游标时锁定游标结果集合在表中对应数据行的所有列和部分列。

如果另一个会话已对活动集中的行加了锁,那么SELECT FOR UPDATE操作一直等待到其它的会话释放这些锁后才继续自己的操作;对于这种情况,当加上NOWAIT子句时,如果这些行真的被另一个会话锁定,则OPEN立即返回并给出:

ORA-0054 :resource busy and acquire with nowait specified.

DECLARE   
    V_deptno employees.department_id%TYPE :=&p_deptno;  
    CURSOR emp_cursor   
  IS   
  SELECT employees.employee_id, employees.salary   
    FROM employees WHERE employees.department_id=v_deptno  
  FOR UPDATE NOWAIT;                    --1、for update  
BEGIN  
    FOR emp_record IN emp_cursor LOOP  
      IF emp_record.salary < 1500 THEN  
        UPDATE employees SET salary=1500  
            WHERE CURRENT OF emp_cursor; --2、WHERE CURRENT OF cursor_name子句  
      END IF;  
    END LOOP;  
END;   

动态游标

与游标一样,动态游标(游标变量)也是一个指向多行查询结果集合中当前数据行的指针。但与游标不同的是,游标变量是动态的,而游标是静态的。

游标只能与指定的查询相连,即固定指向一个查询的内存处理区域,而游标变量则可与不同的查询语句相连,它可以指向不同查询语句的内存处理区域(但不能同时指向多个内存处理区域,在某一时刻只能与一个查询语句相连),只要这些查询语句的返回类型兼容即可。

DECLARE  
   --定义一个游标数据类型  
   TYPE emp_cursor_type IS REF CURSOR;  
   --声明一个游标变量  
   c1 EMP_CURSOR_TYPE;  
   --声明两个记录变量  
   v_emp_record employees%ROWTYPE;  
   v_reg_record regions%ROWTYPE;  
  
BEGIN  
   OPEN c1 FOR SELECT * FROM employees WHERE department_id = 20;  
   LOOP  
      FETCH c1 INTO v_emp_record;  
      EXIT WHEN c1%NOTFOUND;  
      DBMS_OUTPUT.PUT_LINE(v_emp_record.first_name||'的雇佣日期是'  
                            ||v_emp_record.hire_date);  
   END LOOP;  
   --将同一个游标变量对应到另一个SELECT语句  
   OPEN c1 FOR SELECT * FROM regions WHERE region_id IN(1,2);  
   LOOP  
      FETCH c1 INTO v_reg_record;  
      EXIT WHEN c1%NOTFOUND;  
      DBMS_OUTPUT.PUT_LINE(v_reg_record.region_id||'表示'  
                            ||v_reg_record.region_name);  
   END LOOP;  
   CLOSE c1;  
END;
【温室气体】GOSAT 数据产品 阅读详情

相关推荐

STM32F407 BootLoader实战:从零搭建到OTA升级(附完整源码)

本文详细介绍了为STM32F407微控制器从零搭建BootLoader并实现稳定OTA升级的完整实战指南。内容涵盖Flash分区规划、链接脚本配置、核心跳转逻辑、中断向量表重定向、可靠的升级流程设计,并深入探讨了双备份与回滚机制以提升工业级可靠性。文章提供了可直接使用的代码框架,并分享了关键调试技巧,帮助开发者快速掌握STM32远程固件更新技术。

weixin_29192211的博客 439

【Oracle】游标 显式游标与隐式游标

在使用SQL语句进行查询时,获得和处理的结果是整个查询结果集,若需要进一步查询结果中的每条数据进行业务操作,仅靠SQL语句则无法实现,所以PL/SQL提出游标概念解决此类问题。 游标是一种特殊的指针,提供了对一个结果集进行逐行处理的能力。使用游标可以对结果集按行、按条件进行数据的提取、修改和删除操作。在物理结构上,游标是Oracle为用户开设的一个数据缓冲区,存放SQL语句的执行结果。 在Oracle数据库中执行的每个SQL语句都有对应的单独的游标。Oracle主要由以下两种游标类型:游标主要用于对结果集中

奥利文儿的博客 4518

关于发那科机器人抓手及物料搬运阀配置

4:确保抓手阀岛和输入模块配网连接正常,MENU—SETUP—MH Valves—Details,详细界面进入到左上图所示,根据每组阀分配夹钳数量并应用。3:设置搬运有效,抓手是否带点焊可以自行选择,要设置应用选择,物料搬用工具数量,工具上阀岛的数量,夹钳存在数量,工具存在数量,以及真空吸盘,冷启动。​2:MENU—应用选择,将搬运置为有效,剩余其他项根据机器人实际用途进行选择。5:设置夹钳数量,检查打开夹钳,检查闭合夹钳,延迟时间要给选择配置应用。

dxs93的博客 4772

Oracle存储过程学习(显示游标,隐式游标)

Oracle存储过程是一种在Oracle数据库中创建、存储和执行的一组SQL语句的命名代码块。存储过程通常用于执行特定的任务或操作,并且可以在数据库中多次调用,以提高性能、可维护性和安全性。

Masker1133的博客 2596

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2434

从单应矩阵到实际距离:Apriltag测距完整实现指南

本文提供了基于Apriltag实现高精度视觉测距与姿态估计的完整指南。详细阐述了从相机标定、单应矩阵分解到欧拉角与距离计算的完整流程,并深入探讨了四个解的歧义选择、工程实践中的滤波优化与多Tag融合等关键问题,旨在帮助开发者在机器人、AR等应用中实现稳定可靠的距离检测与姿态估计。

n7o8p的博客 558

Oracle中的游标

Oracle中的游标

m0_71406734的博客 1万+

R语言笔记三:矩阵、数组、列表和数据框

1.矩阵        矩阵是二维的,需要有行和列。向量是一维的。        在R软件中,矩阵是有维数的向量,这里的矩阵元素可以是数值型、字符型或者逻辑型,但是每个元素必须拥有相同的模式,这个和向量一致。 (1)创建矩阵: m <- matrix(1:20,4,5) 行数和列数的分配必须满足分配条件。若分配的行列过大,分配的元素不足够,则报错。 m <-

weixin_44384631的博客 6210

ORACLE游标详解

Oracle游标

JF的博客 1万+

AI Agent开发第84课-paddleocr-vl全网唯一最全本地化布署教程

本文详解 PaddleOCR-VL 本地化布署全过程,指出为何在真实生产环境中 PaddleOCR-VL 更稳定、更易部署、更贴近工程落地。同时还会详细比较与 DeepSeek-OCR 的核心差异,为全网独家介绍paddleocr-vl的本地部署实战指南。

打造全国最全的AI Agent开发知识领域的博客 5966

Qt QCustomPlot 图形库详解及使用

QCustomPlot 是一个开源的 Qt C++ 库,专门用于创建数据图表。易于集成到 Qt 项目中。支持多种图表类型,如折线图、散点图、条形图等。提供丰富的交互功能,如缩放、平移、选择和拖动。高度可定制,支持图形的各种样式设置。// 添加第一条曲线i < 101;++i) {// 设置曲线颜色// 添加第二条曲线i < 101;++i) {// 设置曲线颜色// 设置散点样式// 添加图例。

MusicScore的博客 764

Oracle显式游标和隐式游标

用数据库语言来描述游标就是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等。游标for循环是显示游标的一种快捷使用方式,它使用for循环依次读取结果集中的行数据,当form循环开始时,游标自动打开(不需要open),每循环一次系统自动读取游标当前行的数据(不需要fetch),当退出for循环时,游标被自动关闭(不需要使用close)。在变量声明部分定义的游标是静态的,不能在程序运行过程中修改。

wanghost的专栏 877

裸眼3D技术发展与应用前景

这项技术利用传感器或摄像头实时监测观众的位置和视角,然后根据观众的位置信息动态调整投射的图像,确保不同位置的观众都能看到一致的3D效果。这种技术不仅可以在电影院和家庭影院中应用,还可以用于虚拟现实设备和大型展览等领域。裸眼3D呈现是一种不需要佩戴任何特殊设备(如3D眼镜或头盔)即可观看到3D效果的技术。这种技术近年来得到了快速发展,为观众带来了更加沉浸式的视觉体验。总之,裸眼3D呈现技术的发展为观众带来了更加真实、沉浸式的视觉体验。随着技术的不断进步和创新,相信未来裸眼3D将会在更多领域得到应用和推广。

学无止境 1991

【Oracle】PL/SQL 显式游标、隐式游标、动态游标

在PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。 在每个用户会话中,可以同时打开多个游标,其数量由数据库初始化参数文件中的OPEN_CURSORS参数定义。 对于不同的SQL语句,游标的使用

Alpha's 学习笔记 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Oracle】PL/SQL 存储过程 显式游标、隐式游标、动态游标

  【Oracle】PL/SQL 显式游标、隐式游标、动态游标 2013年06月17日 09:02:51 AlphaWang 阅读数:13009更多 个人分类: 【Database】 在PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区(...

许恒的博客 962

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

显式游标和隐式游标的区别

【Oracle】PL/SQL 显式游标、隐式游标、动态游标 在PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。 在每个用户会话中,可以同时打开多个游标,其数量由数据库初始化参数文件

ying217的博客 2893

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

oracle 隐式 游标 显示 循环 动态 select 语句 游标 异常 处理 自定义 游标的概念

<br />摘自:<br />http://heisetoufa.javaeye.com/blog/366483<br />关键字: oracle 隐式 游标 显示 循环 动态 select 语句 游标 异常 处理 自定义 游标的概念:<br />     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。

向往大海专栏 1053

oracle 游标学习(转载itpub论坛)

游标分为隐式、显式、REF三种游标。 而隐式游标和显式游标又都属于静态游标,REF游标属于动态游标。 静态游标和动态游标的最大区别在于静态游标是在运行前将游标变量和SQL关联,而动态游标恰恰相反是在运行后将游标变量和SQL进行关联。 隐式游标是由Oracle自动管理,也称sql游标。所有的DML都被Oracle解析成为一个名为SQL的隐式游标。DML包括Insert、Delete、Update、M...

MaBanSheng的博客 304

oracle数据库之cursor、refcursor及sys_refcursor区别

概图: 1 显式cursor 显式是相对与隐式cursor而言的,就是有一个明确的声明的cursor。 显式游标的声明类似如下 : cursor cursor_name (parameter list) is select ... 游标一个完整的生命周期: declare->open->fetch->close 游标是可以被多次open进行使用的 显式cursor是静态cursor,作用域是全局的 静态cursor也只有pl/sql代码才可以使用她 下面看一个简单的静态显

数据库技术 4098

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常,

关键字: oracle 隐式 游标 显示 循环 动态 select 语句 游标 异常 处理 自定义 游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交

fqli1610的专栏 936

oracle定位cursor,oracle cursor 游标

游标:用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。分类:静态游标:分为显式游标和隐式游标。REF游标:是一种引用类型,类似于指针。显式游标:CURSOR 游标名 ( 参数 ) [返回值类型] ISSelect 语句生命周期:1.打开游标(OPEN)解析,绑定。。。不会从数据库检索数据2.从游标中获取记录(FETCH INTO)执行查询,返回结...

weixin_39656513的博客 184

oracle 记录给游标,Oracle游标 CURSOR实例详解

一、游标概述:游标(cursor)是数据库系统在内存中开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给变量做进一步处理。作用:用于定位结果集的行 和 遍历结果集。二、游标分类:显式游标:在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式...

weixin_39846553的博客 423

oracle输出select结果集,oracle-是否可以从PL / SQL块输出SELECT语句?

oracle-是否可以从PL / SQL块输出SELECT语句?如何获得PL / SQL块以输出SELECT语句的结果,就像执行普通的SELECT一样?例如如何做一个SELECT像这样:SELECT foo, bar FROM foobar;提示:BEGINSELECT foo, bar FROM foobar;END;不起作用。11个解决方案39 votes这取决于您需要的结果。如果确定只有1行...

weixin_39619270的博客 945

20210811pl/sql游标练习

--隐式游标:常用属性使用,隐式游标固定门sql declare begin update employees e set e.salary = e.salary +&新加工资 where e.employee_id = &员工编号; --影响到数据行返回true, if sql%found then dbms_output.put_line('成功更新'||sql%rowcount||'行数据'); end if; commit; if sql%isopen

weixin_45859288的博客 327
上一篇: 维度建模的缓慢变化维
下一篇: oracle分区详解
February13
博客等级 码龄10年 26粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值