当前位置: 首页 > news >正文

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;
    

相关文章:

024.PL-SQL进阶—游标

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…...

从零开始使用树莓派debian系统使用opencv4.10.0进行人脸识别(保姆级教程)

一、总体架构 本文主要是使用树莓派自带的csi摄像头&#xff0c;搭配上opencv4.10.0进行物体的识别。本文使用的环境是python3.7.3&#xff0c;环境不一样有可能安装的opencv的过程也会很不一样&#xff0c;但是python的环境我们可以自己自行安装。 二、树莓派系统的安装 本文…...

golang qq邮件发送验证码

验证码的使用场景 注册/登录&#xff1a;使用验证码可以有效减少垃圾账号注册和恶意登录&#xff1b;短信接口保护&#xff1a;高效减少防止短信接口被刷情况&#xff1b;提交/投票&#xff1a;有效减少恶意刷单、恶意提交、恶意投票等情况&#xff1b;密码找回&#xff1a;用…...

鸿蒙 OS 开发单词打卡 APP 项目实战 20240922 笔记和源码分享

配套有完整的录播课, 需要的私信. 零基础入门级别, 有点前端基础都能学会. 效果截图: 代码截图: 页面完整代码: import { AnswerStatus } from ../enums/AnswerStatus import { PracticeStatus } from ../enums/PracticeStatus import { getRandomQuestions, Question …...

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs

代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目&#xff0c;很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…...

使用Python Pandas导入数据库和文件数据

大家好&#xff0c;在数据分析过程中&#xff0c;数据的导入是第一步&#xff0c;也是最重要的一步。Python的Pandas提供了强大的数据读取功能&#xff0c;支持从多种数据源导入数据&#xff0c;包括CSV、Excel、JSON、SQL数据库、网页等。Pandas库不仅能够处理常见的文件格式&…...

lef 中antenna解释

这些规则主要涉及集成电路设计中的天线效应(Antenna Effect)和通孔(Via)设计规则。 ANTENNAAREADIFFREDUCEPWL 这条规则指定了一个分段线性函数,用于根据连接到切割层的扩散区面积来计算cut_area的缩减因子。扩散区面积值应从0开始单调增加。如果没有定义此规则,PAR(mi)方程中的…...

初试Bootstrap前端框架

文章目录 一、Bootstrap概述二、Bootstrap实例1、创建网页2、编写代码3、代码说明4、浏览网页&#xff0c;查看结果5、登录按钮事件处理6、浏览网页&#xff0c;查看结果 三、实战小结 一、Bootstrap概述 大家好&#xff0c;今天我们将一起学习一个非常流行的前端框架——Boot…...

mysql数据库:超键、候选键、主键与外键

mysql数据库&#xff1a;超键、候选键、主键与外键 1、超键&#xff08;Superkey&#xff09;2、候选键&#xff08;Candidate Key&#xff09;3、主键&#xff08;Primary Key&#xff09;4、外键&#xff08;Foreign Key&#xff09; &#x1f496;The Begin&#x1f496;点点…...

音频转MP3格式困难?如何轻松实现wav转mp3?

格式多样化为我们带来了灵活性和创意的无限可能&#xff0c;但同时&#xff0c;不同格式间的转换也成为了不少用户面临的难题。尤其是当你手握珍贵的WAV音频文件&#xff0c;却希望它们能在更多设备上流畅播放或节省存储空间时&#xff0c;wav转mp3的需求便应运而生。WAV以其无…...

基于vue框架的大连盐业有限公司生产管理系统的设计与实现3hk5y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;计划员,工艺员,生产建模,生产计划,生产信息,生产监视,工艺质量,盐政信息 开题报告内容 一、引言 随着信息技术的飞速发展和市场竞争的日益激烈&#xff0c;传统盐业企业如大连盐业有限公司正面临着转型升级的迫切需求。传统管理模式下…...

《深入理解JAVA虚拟机(第2版)》- 第13章 - 学习笔记【终章】

第13章 线程安全与锁优化 13.1 概述 面向过程的编程思想 将数据和过程独立分开&#xff0c;数据是问题空间中的客体&#xff0c;程序代码是用来处理数据的&#xff0c;这种站在计算机角度来抽象和解决问题的思维方式&#xff0c;称为面向对象的编程思想。 面向对象的编程思想…...

网络工程师学习笔记——网络互连与互联网(三)

TCP三次握手 建立TCP连接是通过三次握手实现的&#xff0c;采用三报文握手主要是为了防止已失效的连接请求报文突然又传送到了&#xff0c;因而产生错误 主动发起TCP连接建立的称为客户端 被动等待的为TCP服务器&#xff0c;二者之间需要交换三个TCP报文段 首先是客户端主动…...

【Tomcat】常见面试题整理 共34题

文章目录 1. 简述什么是Tomcat&#xff1f;2. Tomcat的缺省端口是多少&#xff0c;怎么修改&#xff1f;3. 简述Tomcat 目录结构及作用4. 简述Tomcat有几种部署方式&#xff1f;5. 简述Tomcat容器是如何创建servlet类实例&#xff1f;6. Tomcat有哪几种Connector运行模式&#…...

到时间没回家又不接电话?如何迅速确定孩子的位置?

当孩子未按时回家且无法通过电话联系时&#xff0c;家长往往会感到焦虑。此时&#xff0c;如何迅速确定孩子的位置成为许多家长迫切需要解决的问题。 利用智能手机定位技术是最常见的方法之一。大多数智能手机都内置GPS定位功能&#xff0c;通过“查找设备”应用&#xff0c;家…...

接口自动化--commons内容详解-02

上篇文章主要讲解了接口自动化主要架构框架&#xff0c;这篇文庄主要讲解commons中的内容 1. requests_utils.py 首先讲解这个工具类&#xff0c;主要是因为在接口自动化中&#xff0c;基本都有的接口都是发送请求&#xff0c;获取响应结果&#xff0c;唯一不同的是&#xff0…...

WanFangAi论文写作研究生论文写作神器在线生成真实数据,标注参考文献位置,表格公式代码流程图查重20以内,研究生论文写作技巧

WanFangAi是一个专业的学术论文辅助平台&#xff0c;它提供了一系列工具来帮助用户提升论文写作的效率和质量。以下是WanFangAi的一些核心功能:1.主题探索与文献搜索:用户可以输入关键词和研究领域&#xff0c;WanFangAi会迅速推荐合适的论文主题并提供相关的文献搜索服务。系统…...

cv2.waitkey(30) 按键盘无效

cv2.imshow("detection", color_image) # 窗口显示&#xff0c;显示名为 Capture_Videok cv2.waitKey(100) & 0xFF # 每帧数据延时 1ms&#xff0c;延时不能为 0&#xff0c;否则读取的结果会是静态帧 if k ord(s): # 键盘按一下s, 保存当前照片和机械臂位姿…...

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解 题目传送门 题解 CSP-S1 补全程序&#xff0c;致敬全 A 的答案&#xff0c;和神奇的预言家。 写一下这篇的题解说不定能加 CSP 2024 的 RP 首先看到 k k k 这么大的一个常数&#xff0c;就想到了二分。然后写一个判…...

Ubuntu24.04 安装ssh开启22端口及允许root用户远程登录

1、安装openssh-server插件开启22端口访问 # 安装ssh会默认启动服务并开启22端口 apt update apt install openssh-server 2、开启root用户远程访问 激活root用户&#xff0c;设置root用户登录密码 hunterlocalhost:/$ sudo passwd root New password: Retype new password…...

STM32基础学习笔记-DHT11单总线协议面试基础题7

第七章、DHT11: 单总线协!议 常见问题 1、DHT11是什么 &#xff1f;有什么特性 &#xff1f; 2、单总线协议是什么 &#xff1f;原理 &#xff1f;DHT11的单总线协议的组成 &#xff1f; ## 1、DHT11定义 单总线协议是一种用于在多个设备之间进行通信的协议&#xff0c;所有…...

Redisson分布式锁的概念和使用

Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁&#xff1f;1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff…...

uniapp小程序持续获取用户位置信息,后台位置获取

做一个小程序持续获取用户位置信息的功能&#xff0c;即使小程序切换到后台也能继续获取&#xff0c;getLocation这个api只有小程序在前台才能获取位置&#xff0c;所以不用这个 先申请一个腾讯地图key 在uniapp项目配置源码视图里加上这个代码 先获取权限&#xff0c;再开启…...

优化算法(五)—梯度下降算法(附MATLAB程序)

梯度下降算法&#xff08;Gradient Descent&#xff09;是一种常用的优化算法&#xff0c;用于寻找函数的局部最小值。它通过沿着函数梯度的反方向迭代地调整变量&#xff0c;以逐步找到最优解。梯度下降广泛应用于机器学习和深度学习中&#xff0c;特别是在训练模型时优化损失…...

TypeScript 设计模式之【单例模式】

文章目录 **单例模式**: 独一无二的特工我们为什么需要这样的特工?单例模式的秘密&#xff1a;如何培养这样的特工?特工的利与害代码实现单例模式的主要优点单例模式的主要缺点单例模式的适用场景总结 单例模式: 独一无二的特工 单例模式就像是一个秘密组织里的特殊特工。这…...

UDP与TCP那个传输更快

UDP&#xff08;用户数据报协议&#xff09;和 TCP&#xff08;传输控制协议&#xff09;是互联网协议栈中常用的两种传输层协议。它们在设计和应用上存在一些显著的差异&#xff0c;导致在传输速度和可靠性等方面表现不同。以下是它们之间的比较&#xff0c;特别是关于传输速度…...

如何把PDF样本册转换为网址链接

​随着互联网的普及&#xff0c;将纸质或PDF格式的样本册转化为网址链接&#xff0c;以便于在线浏览和分享&#xff0c;变得越来越重要。本文将为您详细讲解如何将PDF样本册转换为网址链接&#xff0c;让您轻松实现线上展示和分享。 一、了解PDF样本册与网址链接 1. PDF样本册…...

centos7 semanage 离线安装 SELinux

centos7 semanage 离线安装 还是参考一下 换成阿里云的源 之后 &#xff0c;在线更新不&#xff0c;不要用离线安装 centos7 更新 yum源 为 阿里云 LTS https://blog.csdn.net/wowocpp/article/details/142517908 CentOS7安装时使用"基础服务器"选项安装, 后发现没…...

磨具生产制造9人共用一台工作站

随着技术的不断进步与工业自动化的深入发展&#xff0c;如何优化生产流程、提高设备利用率成为了众多企业面临的重大课题。那么在磨具生产制造中实现9人共用一台工作站呢&#xff1f; 一、背景与挑战 在磨具制造行业&#xff0c;高精度、高效率的生产要求与复杂多变的工艺流程…...

Qt clicked()、clicked(bool)、toggled(bool)信号的区别和联系

clicked() 信号 所属控件&#xff1a;clicked()信号是QAbstractButton类&#xff08;及其子类&#xff0c;如QPushButton、QRadioButton、QCheckBox等&#xff09;的一个信号。clicked信号可以说是许多控件&#xff08;特别是按钮类控件&#xff0c;如QPushButton&#xff09;…...