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;
SAP_MM&FI模块-质保金标准解决方案详解 主要讲述了SAP系统质保金的标准实现方案,包含业务背景、后台配置、前台业务操作记录,以及关键点的AI解释; 阅读详情

相关推荐

一文详解脉搏血氧测量原理与方法

本文摘要:血氧饱和度(SpO2)是评估人体氧合功能的重要指标,反映血红蛋白携氧能力。其测量基于光电容积描记法(PPG),利用红光(660nm)和红外光(940nm)通过组织时的吸收差异计算。脉搏波特征与心血管状态相关,动脉硬化会影响波形特征。Masimo公司的信号提取技术(SET)通过并行算法有效解决了传统血氧仪在运动、弱灌注情况下的测量误差问题,显著提升了临床监测的准确性和可靠性。该技术已成为血氧监测的金标准,在降低误报率、缩短响应时间方面具有显著优势。

m0_50146396的博客 2011

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

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

奥利文儿的博客 4518

深入解析STM32定时器中央对齐模式3的双中断机制

本文深入解析了STM32定时器中央对齐模式3的双中断机制。该模式在一个PWM周期内,会在计数器到达ARR(上溢)和0(下溢)时各触发一次更新中断,实现更精细的实时控制。文章详细阐述了其工作原理、配置方法,并指导如何在中断服务函数中通过DIR位区分中断来源,同时探讨了其在电机控制、数字电源等场景下的应用优势与CPU负载挑战。

weixin_29164185的博客 492

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

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

Masker1133的博客 2596

1.安装EMQX服务器

阿里云;EMQX

hfh8130的博客 5310

AUTOSAR开发实战:NvM模块如何解决汽车电子中的EEPROM与Flash存储难题?

本文深入探讨了AUTOSAR中的NvM模块如何有效解决汽车电子系统中EEPROM与Flash存储的难题。通过分层架构设计,NvM模块实现了硬件抽象与统一管理,支持数据一致性检查、错误恢复等高级功能,显著提升了存储可靠性和耐久性。文章结合实战案例,详细解析了NvM的核心机制及工程优化方案,为汽车电子开发者提供宝贵参考。

e3f4g5的博客 563

Oracle中的游标

Oracle中的游标

m0_71406734的博客 1万+

如何用python自己复现worldquant brain中的回测结果

本文介绍了在Python中复现WorldQuant Brain平台上alpha 101因子1和4的回测框架构建要点。重点分析了Brain平台的策略设置:使用TOP 3000高流动性股票(可用中证1000/2000替代);delay=1表示t日信号在t+1日开盘调仓;详细解释了market/sector/industry/subindustry四级中性化方法;说明了decay参数控制持仓权重线性衰减;以及TRUNCATION参数限制单股仓位风险。文章还探讨了不同调仓时点的实现差异,为自主构建量化回测系统提供了

夏之微风的博客 731

ORACLE游标详解

Oracle游标

JF的博客 1万+

安装anaconda3时出现错误:Failed to link extracted packages to D:\anaconda!...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1478

dolphinscheduler服务注册中心源码解析(一)服务注册与发现整体设计

下一篇文章我们开始讲解dolphinscheduler基于Zookeeper实现注册中心的源码解析。

最爱嫣夜来 374

Oracle显式游标和隐式游标

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

wanghost的专栏 877

Raspberry Pi 4 ARM Trusted Firmware 技术解析

摘要: 本文详细介绍了在树莓派4(Raspberry Pi 4)上移植ARM可信固件(TF-A)的实现方案与安全考量。该移植专注于BL31功能,作为非安全世界(如Linux内核)的启动桥梁,支持加载EL2级别程序。文章分析了启动流程、内存映射设计,并对比了RPi3与RPi4的关键差异,指出当前版本缺乏硬件级安全内存保护的局限性。此外,提供了构建指南、配置说明及设备树自动修补的实现细节,强调通过config.txt简单配置即可启动64位内核。该方案充分利用树莓派原有GPU固件流程,兼顾兼容性与简易性。

Linux内核架构师 932

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

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

Alpha's 学习笔记 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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、付费专栏及课程。

余额充值