024.PL-SQL进阶—游标

无奋斗不青春

课 程 推 荐
我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库教程合集 👈👈
MySQL数据库教程:👉👉 MySQL数据库教程合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
优 质 教 程 推 荐:👉👉 Python爬虫从入门到入狱系列 合集 👈👈
.

分隔线
在这里插入图片描述

PL-SQL进阶—游标

    • 游标
      • 作用
      • 显式游标
      • 游标概念及意义
      • 游标的类型
        • 隐式游标
        • 显示游标
        • 游标实例
        • 带参数的游标
        • 可更新的游标
        • For 循环游标
        • Fetch游标

游标

作用

  • 在pl/sql编程中,我们通常处理多行事务是通过游标来实现的(这个可以类比java中迭代器概念)
  • 游标是一个指向上下文的句柄和指针,通过游标pl/sql可以控制上下文区和处理语句时上下文会发生一些事情。
  • 对于不同的sql语句游标的使用情况又是不同的,如下:
    • 对于非查询语句 : 游标是隐式的;
    • 对于结果为单行的查询语句:游标是隐式的或显示的;
    • 对于结果为多行的查询语句:游标是显示

显式游标

  • 第一步:定义游标

    CURSOR cursor_name [(param1,parame2..)] IS SELECT. 
    //后面接的是一个查询语句,一般都是返回多行的那种。
    其中参数param可带可不带,根据需要,参数的定义也要定义参数名,参数类型等(这里特别要主要的是在指定参数类型的时候不需要指定类型大小 如number(20),这都是错的)
    
  • 第二步:打开游标

    打开游标实质就是执行游标对应的select语句,然后将查询结果存储在工作区中,然后将游标指向结果集中的第一行数据,而且如果select语句中有for update,则open的同时还会锁定查询结果集所对应的表中的行数据。

    OPEN cursor_name [value,value2…]//pl/sql中不能使用open重复打开同一个游标 
    
  • 第三步:提取数据 就是检索结果集中的数据行,放入到指定的输出变量

    fetch cursor_name into {variable_list | record_variable };
    
    • 对该记录进行处理,
    • 继续处理,直到结果集中没有记录
  • 第四步:关闭游标 ,释放游标所占有的资源,同时使该工作区变为无效,不能再使用fetch提取数据,可以使用open重新打开。

    close cursor_name;
    
  • 示例

  • 下面就通过一些实例来看看游标到底怎么用的吧。

  • 如:查询员工表前十名的员工的信息

    declare v_sal employees.salary%type; v_name employee.last_name%type; cursor empcursor is select last_name,salary from employees where rownum <11 order by desc; 
    begin –打开游标 open empcursor ; –提取数据; fetch empcursor into v_name,v_sal ; while empcursor%found loop dbms_output.put_line(v_name||,||v_sal); fetch empcursor into v_name,sal; end loop; close empcursor; 
    end;
    
  • 在演示一下带参数的(rownum根据参数确定)

    declare v_sal employees.salary%type; v_name employee.last_name%type; cursor empcursor(empno number default 11) is select last_name,salary from employees where rownum
    


游标概念及意义

  • 1、游标概念:游标本质是一块内存区域,由系统或用户以变量的形式定义,可以提高数据库数据处理速度。游标的工作机制是一种能从包括多行数据记录的结果集中每次提取一行记录的机制,即游标提供了在逐行的基础上操作表中数据的方法。
  • 注意:类似于java中迭代器(iterator)
  • 2、解决问题:数据库在并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。在PL/SQL程序中,对于处理多行记录的事务经常使用游标来实现。

游标的类型

  • 1、隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标;
  • 2、显式游标:显式游标用于处理返回多行的查询;
  • 3、REF 游标:REF 游标用于处理运行时才能确定的动态 SQL 查询的结果;
隐式游标
  • 1、隐式游标概念:在PL/SQL中使用DML语句时自动创建隐式游标,隐式游标自动声明、打开和关闭,其名为 SQL,通过检查隐式游标的属性可以获得最近执行的 DML 语句的信息;
  • 2、隐式游标的属性:
    • (1)%FOUND:SQL 语句影响了一行或多行时为 TRUE;
    • (2)%NOTFOUND:SQL 语句没有影响任何行时为TRUE;
    • (3)%ROWCOUNT:SQL 语句影响的行数;
    • (4)%ISOPEN:游标是否打开,始终为false。
  • 注意:忽略大小写即大小写都可以。
显示游标
  • (一)显示游标处理需要四个PL/SQL步骤:
  • 1、定义(声明)游标:定义一个游标名以及与其对应的select语句。
    • 语法:
      cursor cursor_name[(parameter[,parameter])] [return datatype]
      isselect_statement;
      
    • 参数说明:
      • 游标参数只能为输入参数
      • 格式如下:
        parameter_name [IN] datatype
        
      • 注意:in关键字可以省略,在指定数据类型时,不能使用长度约束。
      • 如:NUMBER(4),CHAR(10)等都是错误的
    • 返回值
      • [return datatype]是可选的,表示游标返回数据的数据类型
      • 如果选择有,则应该严格与select_statement中的选择列表在数据次序和数据类型上匹配一致
      • 注意:数据类型一般是记录数据类型或带“表名或者游标名%ROWTYPE”的数据类型。
  • 2、 打开游标
    • 就是执行游标所对应的SELECT语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合
    • 注意:如果游标查询语句中带有for update选项,open语句还将锁定数据库表中游标结果集合对应的数据行
    • 语法:
      open cursor_name[value1,value2,...];
      
      • 注意:PL/SQL程序不能用OPEN语句重复打开一个游标。
  • 3、提取游标数据
    • 就是检索结果集合中的数据行,放入指定的输出变量中
    • 语法:
      fetch cursor_name into {variable_list|record_variable};
      
      • 注意:variable_list表示table属性定义的数组,数据类型需指定和数据库表中某个字段类型一致
    • 语法:
      type 变量名词 is table of emp.ename%type index by binary_integer;
      
      • 注意:record_variable表示表名或者游标名%rowtype属性用于定义record变量,类似定义一个类,该类可以直接调用数据库表中所有字段。
    • fetch语句执行过程
      • 执行FETCH语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行
      • 当检索到最后一行数据时,如果再次执行FETCH语句,将操作失败,并将游标属性%NOTFOUND置为TRUE
      • 所以每次执行完FETCH语句后,检查游标属性%NOTFOUND就可以判断FETCH语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了值。继续处理,直到活动集合中没有记录;
  • 4、关闭游标
    • 当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH语句取其中数据。
    • 注意:关闭后的游标可以使用OPEN语句重新打开。
    • 语法:
      close cursor_name;
      
游标实例
  • 实例1
    declarecursor c is select * from emp;demo c%rowtype;
    beginopen c;fetch c into demo;dbms_output.put_line(demo.ename);close c;
    end;
    
  • 实例2
    declarecursor c is select * from emp;v_emp c%rowtype;
    beginopen c;loopfetch c into v_emp;exit when (c%notfound);dbms_output.put_line(v_emp.ename);end loop;close c;
    end;
    
  • 实例3
    declarecursor c is select * from emp;v_emp c%rowtype;
    beginopen c;fetch c into v_emp;while (c%found) loopdbms_output.put_line(v_emp.ename);fetch c into v_emp;end loop;close c;
    end;
    
  • 使用游标建议使用for循环(因为for循环不用fetch,)
    declarecursor c is select * from emp;
    beginfor v_emp in c loopdbms_output.put_line(v_emp.ename);end loop;
    end;
    
带参数的游标
  • 实例
    declarecursor c (v_deptno emp.deptno%type, v_job emp.job%type) is select ename, sal from emp where deptno = v_deptno and job = v_job;
    beginfor v_temp in c(30,'CLERK') loopdbms_output.put_line(v_temp.ename);end loop;
    end;
    
可更新的游标
  • 实例
    declarecursor c is select * from emp2 for update;
    beginfor v_temp in c loopif (v_temp.sal < 2000) thenupdate emp2 set sal = sal * 2 where current of c;elsif (v_temp.sal = 5000) thendelete from emp2 where current of c;end if;end loop;commit;
    end;
    
For 循环游标
  • 定义游标
  • 定义游标变量
  • 使用for循环来使用这个游标
    declare--类型定义cursor c_job is select empno,ename,job,sal from emp where job='MANAGER';--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型c_row c_job%rowtype;
    beginfor c_row in c_job loopdbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);end loop;
    end;
    
Fetch游标
  • 使用的时候必须要明确的打开和关闭
    declare --类型定义cursor c_job is select empno,ename,job,sal from emp where job='MANAGER';--定义一个游标变量c_row c_job%rowtype;
    begin-- 打开游标open c_job;-- 循环loop--提取一行数据到c_rowfetch c_job into c_row;--判断是否提取到值,没取到值就退出exit when c_job%notfound;   -- 当c_job没有查找到数据notfound,则退出exitdbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);end loop;--关闭游标close c_job;
    end;
    

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

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

相关文章

JAVA红娘婚恋相亲交友系统源码全面解析

在数字化时代&#xff0c;红娘婚恋相亲交友系统成为了连接单身男女的重要桥梁。JAVA作为一种流行的编程语言&#xff0c;为开发这样的系统提供了强大的支持。编辑h17711347205以下是对JAVA红娘婚恋相亲交友系统源码的全面解析&#xff0c;以及三段示例代码的展示。 系统概述 …

【Gitee自动化测试4】本地Git分支的增删查,本地Git分支中文件的增删查,本地文件的暂存/提交,本地分支的推送

一、流程 本地创建分支&#xff0c;设定连接什么云分支本地创建文件&#xff0c;暂存、提交–>本地分支本地分支推送所有修改–>云仓库 二、分支概念 在版本回退里&#xff0c;每次提交&#xff0c;git都把它们串成一条时间线&#xff0c;这条时间线可以理解为是一个分…

Verilog基础:时序调度中的竞争(四)(描述时序逻辑时使用非阻塞赋值)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言&#xff0c;Verilog HDL常常需要使用语句描述并行执行的电路&#xff0c;但其实在仿真器的底层&#xff0c;这些并行执行的语句是有先后顺序…

论文阅读:LM-Cocktail: Resilient Tuning of Language Models via Model Merging

论文链接 代码链接 Abstract 预训练的语言模型不断进行微调&#xff0c;以更好地支持下游应用。然而&#xff0c;此操作可能会导致目标领域之外的通用任务的性能显著下降。为了克服这个问题&#xff0c;我们提出了LM Cocktail&#xff0c;它使微调后的模型在总体上保持弹性。…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑异步区域调频资源互济的电能、惯性与一次调频联合优化出清模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Spring Boot助力:小徐影院管理系统

第二章开发技术介绍 2.1相关技术 小徐影城管理系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它…

python学习第十二节:python开发图形界面

python学习第十二节&#xff1a;python开发图形界面 创建一个窗口实例化窗口对象调用窗口设置窗口大小设置窗口的标题设置窗口图标否能够改变窗口设置窗口的背景 创建容器组件容器组件的介绍组件参数的介绍label标签label添加标签控件 label添加标签定位label的relief参数label…

无人机之模拟图传篇

无人机的模拟图传技术是一种通过模拟信号传输图像数据的方式&#xff0c;它通常使用无线电模块或专用通信协议进行数据传输。 一、基本原理 模拟图传技术的工作原理是将摄像头或相机设备采集到的图像数据&#xff0c;通过模拟信号的形式进行传输。这些模拟信号在传输过程中可能…

9.26 Buu俩题解

[CISCN2019 华东北赛区]Web2 看wp写完之后写的 知识点 存储型XSS与过滤绕过sql注入 题解 好几个页面&#xff0c;存在登录框可以注册&#xff0c;存在管理员页面(admin.php) ->既然存在管理员页面&#xff0c;且直接访问admin.php提示我们 说明存在身份验证&#xff0…

安全教育培训小程序系统开发制作方案

安全教育培训小程序系统是为了提高公众的安全意识&#xff0c;普及安全知识&#xff0c;通过微信小程序的方式提供安全教育培训服务&#xff0c;帮助用户了解并掌握必要的安全防范措施。 一、目标用户 企业员工&#xff1a;各岗位员工&#xff0c;特别是IT部门、财务、行政等对…

你们猜!吊打Oracle的国产数据库有哪几家?

今天闲暇之余看到某vx群聊得很火热&#xff0c;这个群聚集了国内不少数据库大咖&#xff0c;其中大家聊到国产数据库遥遥领先了。 最开始主要是一个朋友提到目前很多企业拍板的人并不懂数据库&#xff0c;甚至很多知名数据库都没听过。 然后大家就开始聊到国产数据库了&#xf…

《微信小程序实战(4) · 地图导航功能》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

Python(六)-拆包,交换变量名,lambda

目录 拆包 交换变量值 引用 lambda函数 lambda实例 字典的lambda 推导式 列表推导式 列表推导式if条件判断 for循环嵌套列表推导式 字典推导式 集合推导式 拆包 看一下在Python程序中的拆包&#xff1a;把组合形成的元组形式的数据&#xff0c;拆分出单个元素内容…

电商大变革!TikTok携手亚马逊重塑购物边界,开启海外即看即买新篇章

在电商界&#xff0c;亚马逊还是一众电商平台难以超越的存在。据外媒报道&#xff0c;最新预测显示&#xff0c;预计到2024年底&#xff0c;亚马逊全球将拥有970万卖家&#xff0c;活跃卖家将达到190万。 TikTok携手亚马逊重塑购物边界&#xff0c;开启海外即看即买新篇章 在数…

RK3568 android11 适配鼎桥MT5710-CN 5G模块

一,概述 鼎桥MT571X设备和Android系统主要通过USB接口进行数据通信,Android系统上的Linux内核需要根据鼎桥模块设备上报的USB设备接口加载USB驱动,USB驱动正确加载后,鼎桥模块才能正常工作。 Android系统中支持鼎桥模块设备相关的Linux内核驱动架构,如下图所示: 在Lin…

动手学深度学习(李沐)PyTorch 第 4 章 多层感知机

4.1 多层感知机 隐藏层 我们在 3.1.1.1节中描述了仿射变换&#xff0c; 它是一种带有偏置项的线性变换。 首先&#xff0c;回想一下如 图3.4.1中所示的softmax回归的模型架构。 该模型通过单个仿射变换将我们的输入直接映射到输出&#xff0c;然后进行softmax操作。 如果我们…

21天全面掌握:小白如何高效学习AI绘画SD和MJ,StableDiffusion零基础入门到精通教程!快速学习AI绘画指南!

‍‍大家好&#xff0c;我是画画的小强。 今天给大家分享一些我长期以来总结的AI绘画教程和各种AI绘画工具、模型插件&#xff0c;还包含有视频教程 AI工具&#xff0c;免费送&#x1f447;&#x1f447;‍‍ 这份完整版的AI绘画全套学习资料已经上传CSDN&#xff0c;朋友们如…

Word:表格公式计算

一、求和公式 以下演示是在windows操作系统环境&#xff0c;office软件进行操作的 SUM(LEFT) 全部步骤图如下&#xff1a; 步骤一 光标置于单元格&#xff0c;依次单击【表格工具-布局】→【数据】→【公式】 步骤二 在【公式】一栏中&#xff0c;默认的是“SUM(LEFT)”求和…

AI产品经理学习路径:从零基础到精通,从此篇开始!

一、AI产品经理和和通用型产品经理的异同&#xff1a; 市面上不同的公司对产品经理的定位有很大的差别&#xff0c;一名合格的产品经理是能对软件产品整个生命周期负责的人。 思考框架相同&#xff1a; AI产品经理和通用型软件产品经理的底层思考框架是一样的&#xff0c;都是…

叉车高位显示器无线摄影,安装更加便捷!

叉车叉货&#xff0c;基本功能&#xff0c;但货叉升降高度确不一定&#xff0c;普通的3米左右&#xff0c;高的十几米&#xff0c;特别是仓储车&#xff0c;仓库叉货空间小&#xff0c;环境昏暗&#xff0c;视线受阻严重&#xff0c;司机叉货升的那么高怎么准确无误的插到货呢&…