024.PL-SQL进阶—游标

news2024/11/20 23:27:41

无奋斗不青春

课 程 推 荐
我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 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]
      is
          select_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
    declare
        cursor c is select * from emp;
        demo c%rowtype;
    begin
        open c;
        fetch c into demo;
        dbms_output.put_line(demo.ename);
        close c;
    end;
    
  • 实例2
    declare
        cursor c is select * from emp;
        v_emp c%rowtype;
    begin
        open c;
        loop
            fetch c into v_emp;
            exit when (c%notfound);
            dbms_output.put_line(v_emp.ename);
        end loop;
        close c;
    end;
    
  • 实例3
    declare
        cursor c is select * from emp;
        v_emp c%rowtype;
    begin
        open c;
        fetch c into v_emp;
        while (c%found) loop
            dbms_output.put_line(v_emp.ename);
            fetch c into v_emp;
        end loop;
        close c;
    end;
    
  • 使用游标建议使用for循环(因为for循环不用fetch,)
    declare
        cursor c is select * from emp;
    begin
        for v_emp in c loop
            dbms_output.put_line(v_emp.ename);
        end loop;
    end;
    
带参数的游标
  • 实例
    declare
        cursor 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;
    begin
        for v_temp in c(30,'CLERK') loop
            dbms_output.put_line(v_temp.ename);
        end loop;
    end;
    
可更新的游标
  • 实例
    declare
        cursor c is select * from emp2 for update;
    begin
        for v_temp in c loop
            if (v_temp.sal < 2000) then
                update emp2 set sal = sal * 2 where current of c;
            elsif (v_temp.sal = 5000) then
                delete 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;
    begin
        for c_row in c_job loop
            dbms_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_row
            fetch c_job into c_row;
            
            --判断是否提取到值,没取到值就退出
            exit when c_job%notfound;   -- 当c_job没有查找到数据notfound,则退出exit
                dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
        end loop;
        
        --关闭游标
        close c_job;
    end;
    

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

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

相关文章

STM32 Modbus主从站实例程序-FreeRTOS

资料下载地址&#xff1a;STM32 Modbus主从站实例程序-FreeRTOS​​​​​​​ 基本设置 启用Freertos,添加任务 设置中断优先级 设置长生成MDK工程 工程里面添加Modbus库 修改main.c 修改freertos.c 编译下载到单片机,完美运行

黄奕前夫勇夺“全球金融圈奥斯卡”!与她离婚后,姜凯身价涨30倍

黄奕前夫勇夺“全球金融圈奥斯卡”&#xff01;与她离婚后&#xff0c;姜凯身价涨30倍 近日&#xff0c;小编被一则经济类新闻吸引。姜凯主理的凯资本Kai Capital荣获“2024年度全球最佳多策略对冲基金”。 这不是演员黄奕的第一任丈夫姜凯吗&#xff1f; 这个奖项可不一般。…

Ubuntu LLaMA-Factory实战

一、Ubuntu LLaMA-Factory实战安装&#xff1a; CUDA 安装 CUDA 是由 NVIDIA 创建的一个并行计算平台和编程模型&#xff0c;它让开发者可以使用 NVIDIA 的 GPU 进行高性能的并行计算。 首先&#xff0c;在 https://developer.nvidia.com/cuda-gpus 查看您的 GPU 是否支持CU…

html TAB切换按钮变色、自动生成table--使用函数优化结构

<!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 1px solid #ccc; padding: 1px; marg…

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…

怎么制作线上报名表_解锁报名新体验

在这个数字化飞速发展的时代&#xff0c;每一次活动的举办都力求高效、便捷与个性化。线上报名表&#xff0c;作为连接主办方与参与者的桥梁&#xff0c;其重要性不言而喻。它不仅是信息收集的工具&#xff0c;更是品牌形象的展示窗口&#xff0c;能够直接影响参与者对活动的第…

用最新的C++技术,如何实现一个序列化工具库?

在现代C的发展中&#xff0c;新引入的语言特性为高效且易用的序列化和反序列化库的开发提供了强大的支持。我们今天一起来探索如何在现代C特性下写出更简洁、更易维护的序列化工具代码。 现有序列化库的挑战 传统的C序列化库&#xff0c;如Boost.Serialization和Cereal&#…

神经网络(四):UNet语义分割网络

文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 一、简介 UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络结构&#xff0c;因此称为UNet。该网络具有编码器和解码器结构&#xff0c;两种结构的功能如下&#…

Redis的数据类型常用命令

目录 前言 String字符串 常见命令 set get mget mset setnx incr incrby decr decyby append Hash哈希 常见命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx List 列表 常见命令 lpush lrange lpushx rpush rpushhx lpop…

postman下载安装和导入导出脚本一键执行

下载和安装 首先&#xff0c;下载并安装PostMan&#xff0c;请访问PostMan的官方下载网址&#xff1a;https://www.getpostman.com/downloads/ 下载所需的安装程序后&#xff0c;直接安装即可 第一次打开会要求登录账号密码&#xff0c;如果没有&#xff0c;直接关闭&#xf…

海报制作哪个软件好?建议试试这5个

2024年过得飞快&#xff0c;转眼间国庆佳节即将到来。 在这个举国欢庆的时刻&#xff0c;无论是商家还是个人&#xff0c;都希望通过海报来传递节日的喜悦和祝福。制作一张吸引人的海报&#xff0c;不仅能提升品牌形象&#xff0c;还能增强节日氛围。 那么&#xff0c;如何快…

【Python报错已解决】TypeError: can only concatenate str (not “int“) to str

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【Java 问题】基础——Java 概述

Java 概述 1. 什么是 Java ?2. Java 语言有哪些特点3. JVM、JDK 和 JRE 有什么区别&#xff1f;4. 说说什么是跨平台性&#xff1f;原理是什么&#xff1f;5. 什么是字节码&#xff1f;采用字节码的好处是什么&#xff1f;6. 为什么说 Java 语言 "编译与解释并存"?…

汽车行业SAP全球模版导入方案【集团出海部署】

在汽车行业实施SAP系统是一个复杂且具挑战性的项目&#xff0c;涉及多个业务模块和跨部门协作。以下是一个汽车行业SAP实施的导入方案&#xff0c;包括关键步骤、模块选择、最佳实践和注意事项。 1. 项目启动及规划 项目启动 项目发起&#xff1a;确定项目范围、目标和业务需…

Spring源码-ConfigurationClassPostProcessor类解析spring相关注解

ConfigurationClassPostProcessor类的作用 此类是一个后置处理器的类&#xff0c;主要功能是参与BeanFactory的建造&#xff0c;主要功能如下 1、解析加了Configuration的配置类 2、解析ComponentScan扫描的包 3、解析ComponentScans扫描的包 4、解析Import注解 该类在springbo…

【原创教程】如何用西门子1500读写巴鲁夫RFID

实现的功能及应用的场合 通过使用RFID进行对托盘信息工件信息的追踪记忆&#xff0c;方便了解工件的状态内容。适用于流水线等场合。 硬件配置 巴鲁夫RFID 巴鲁夫RFID一套包含&#xff1a;RFID分析单元&#xff0c;RFID数据读写头&#xff0c;RFID数据载体。 ①RFID分析单…

ai写论文哪个平台好?分享4款ai论文写作平台软件

在当前的学术研究和论文写作领域&#xff0c;AI技术的应用已经成为一种趋势。通过智能算法和大数据分析&#xff0c;AI工具能够帮助学者和学生提高写作效率、优化内容结构&#xff0c;并确保论文的原创性和质量。以下是四款备受推荐的AI论文写作平台软件&#xff1a; 1. 千笔-…

Js基础

JS编写位置 将代码编写在html网页script标签 <script>// 弹出alert("test")// 控制台输出日志console.log("hello world")// 向网页输入内容&#xff0c;即往body中写内容document.write("write content")</script> 将代码编写在外部…

原腾讯云AI产品线项目经理李珊受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 原腾讯云AI产品线项目经理、资深项目管理专家李珊女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为&#xff1a;AI助力项目经理的决策支持系统。大会将于10月26-27日在北京举办…

生态布局再进一步!拓数派 PieCloudDB Database 与 openEuler 完成兼容互认证

随着信息技术的快速发展&#xff0c;国产化自主创新已成为国家战略的核心部分。拓数派自主研发的云原生虚拟数仓 PieCloudDB 与国产操作系统 openEuler 已完成相互兼容性测试&#xff0c;并获得 openEuler 技术测评证书。 目前&#xff0c;拓数派已成功与华为鲲鹏、麒麟软件、龙…