文章目录

  • 一、概述
  • 二、显示游标
    • 1、声明游标
    • 2、打开游标
    • 3、读取游标
    • 4、关闭游标
  • 三、隐式游标
  • 四、游标的属性
    • 1、%FOUND(是否找到游标)
    • 2、%NOTFOUND(是否没找到游标)
    • 3、%ROWCOUNT(游标行数)
    • 4、%ISOPEN(游标是否打开)
    • 5、参数化游标
  • 五、游标变量
    • 1、声明游标变量
    • 2、打开游标变量
    • 3、关闭游标变量
  • 六、通过for循环遍历游标

前言:本文为本人学习笔记,所用到的例子均来自oracle11g自带的scott模式,参考书籍清华大学出版社Oracle从入门到精通,还请大家支持购买正版书籍,话不多说,直接开始!

一、概述

什么是游标

  • 游标提供了一种从表中检索数据并进行操作的灵活手段
  • 处理客服端发送到服务器端的sql语句,或者是批处理、存储过程、触发器中的数据处理请求

游标的作用

  • 通过游标PL/SQL程序可以一次处理查询结果集其中的一行,对该数据进行特定操作

基本原理

  • PL/SQL块在执行SELECT、INSERT、UPDATE、DELETE语句时,Oracle会在内存中为其分配上下文区(缓冲区),游标是指向该区的一个指针。
  • 游标为应用程序提供了一种具有对多行数据查询结果集中的每一行数据分班进行单独处理的方法
  • 游标分显示游标、隐式游标、REF游标

二、显示游标

  • 显示游标是用户声明和操作的一种游标,通常用于操作查询结果集(SELECT语句返回的查询结果)
  • 使用显示游标处理数据的步骤:声明游标、打开游标、读取游标、关闭游标
  • 读取游标操作每次只能读取一行数据,对于多条记录需要反复读取直到读取不到为之,可使用for循环遍历
  • 声明游标需要在声明部分进行,其他在执行或异常处理部分进行

1、声明游标

cursor 游标名(游标输入参数)
is select语句
-- 游标参数可以有多个

示例:声明游标读取emp表中job='SALEMAN’的职员

declarecursor cur_emp(var_job in varchar2:='SALEMAN') -- varchar不可以指定长度,其他类型也一样is select empno,ename,salfrom emp where job = var_job;

2、打开游标

OPEN 游标名(参数) -- 参数如果为空,则为默认参数

示例:用上面声明的游标查找job='MANAGER’的人

open cur_emp('MANAGER'); -- 如果没有输入参数,则默认查找SALEMAN

3、读取游标

FETCH CUR_NAME INTO {VARIABLE}; -- VARIABLE 一个变量列表或“记录”变量
  • 游标中包含一个数据行指针用来指向当前数据行
  • 打开游标时指针指向第一行,使用 FETCH … INTO 语句后指向下一行
  • 指针指到最后一条记录为止(实际上指针最后一条记录之后是不存在的,为空,这里只是表示遍历完所有数据),此时游标的%FOUND属性值为FALSE

示例:声明一个检索emp表的游标,搜索职务为 MANAGER 的员工信息,使用 FETCH…INTO 语句和 WHILE 语句来读取游标中所有员工信息,最后输出读取到的信息

-- 去cmd - sqlplus执行
set serveroutput on
declarecursor cur_emp(var_job in varchar2:='SALMANE')  -- 声明游标,检索员工信息is select empno,ename,sal from emp  where job = var_job;type record_emp is record(  -- 声明一个记录类型(RECORD 类型)-- 定义当前成员变量var_empno emp.empno%type,var_ename emp.ename%type,var_sal emp.sal%type);emp_row record_emp; -- 声明一个 record_enp 类型的变量
beginopen cur_emp('MANAGER');   -- 打开游标fetch cur_emp into emp_row;  -- 让游标指向第一行,并将值保存到emp_row中while cur_emp%found loopdbms_output.put_line(emp_row.var_ename||'的编号是'||emp_row.var_empno||',工资是'||emp_row.var_sal);fetch cur_emp into emp_row;  -- 让指针指向下一行,并将值保存到emp_row中end loop;close cur_emp; -- 关闭游标
end;
/

使用while之前,先试用 FETCH … INTO 将游标指针指向第一行,保证 %FOUND 值为true,从而保证循环条件成立。

4、关闭游标

-- close 游标名
close cur_emp;

关闭游标后,系统会释放被占用的内存

三、隐式游标

  • 执行一个SQL语句时,系统会自动创建一个隐式游标
  • 隐式游标主要用来处理数据操作语句(如UPDATE、DELETE等)
  • 隐式游标也有属性,因此在使用隐式游标的属性时,需要在属性前加上隐式游标的默认名称 – SQL
  • 实际开发中,常使用隐式游标来判断更新数据行或删除数据行的情况

示例:吧emp表中的 SALESMAN 的工资上调20%,然后使用隐式游标的sql的%ROWCOUNT属性输出上调工资的员工数量

set serveroutput on
beginupdate emp set sal=sal*(1+0.2) where job = 'SALESMAN';if sql%notfound thendbms_output.put_line('0'); --如果没有数据行被影响elsedbms_output.put_line(sql%rowcount); --输出受影响的数据行end if;
end;
/

四、游标的属性

  • 游标属性只能用在PL/SQL的流程控制语句内,而不能用在SQL语句内
  • 显示游标与隐式游标都具有以下四个属性,通过这些属性可以获知SQL语句的执行结果以及该游标的状态信息

1、%FOUND(是否找到游标)

  • 表示当前游标是否指向有效一行,是 -> true ; 否 -> false
  • 在隐式游标中%FOUND属性的引用方法是SQL %FOUND

示例:

delete from emp where empno = emp_id;  -- emp_id为一个有值变量
if sql %FOUND theninsert into success valuse(empno);   -- 删除成功,写进SUCCESS表里
elseinsert into fail valuse(empno);      -- 删除失败,写进Fail表里
end if;

2、%NOTFOUND(是否没找到游标)

与%FOUND相反

3、%ROWCOUNT(游标行数)

  • 记录了游标抽取过的记录行数,也可以理解为当前游标所在的行号

示例:

loopfetch cur_emp into var_empno,var_ename,var_job;exit when cur_emp%rowcount = 10                 -- 只抽取10条记录...
end loop;

4、%ISOPEN(游标是否打开)

示例:

if cur_emp%isopen tnehfetch cur_emp into var_empno,var_ename,var_job;
elseopen cur_emp;
end if;

5、参数化游标

定义游标时带上参数,使得在使用游标时根据参数不同所选中的数据行也不同,达到动态使用的目的

示例:声明一个游标检索指定员工的信息.

set serveroutput on
declare var_ename varchar2(50);      -- 声明变量,用来存储员工名称var_job varchar2(50);        -- 声明变量,用来存储员工职务cursor cur_emp               -- 定义游标,检索指定编号的信息is select ename,job from emp where empno = 7499;
beginopen cur_emp;                -- 打开游标  fetch cur_emp into var_ename,var_job; --读取游标,并存储员工名称和职务if cur_emp%found thendbms_output.put_line(var_ename || var_job);elsedbms_output.put_line('无数据');end if;
end;
/

五、游标变量

  • 游标变量是动态的,可以在运行时与不同的语句相关联
  • 被用于处理多行的查询结果集
  • 不同于特定的查询绑定,游标变量在打开游标时才能确定对于的查询

1、声明游标变量

  • 游标变量是一种引用类型,程序运行时可以指向不同的存储单元
  • 游标变量的返回类型必须是一个记录类型

定义一个游标变量的完整语法

-- 类型名是新的引用类型的名字
-- 返回类型是一个记录类型
TYPE<类型名> IS REF CURSOR
RETURN<返回类型>

2、打开游标变量

OPEN <游标变量> FOR <SELECT语句>

如果游标变量是受限的,则SELECT语句返回的类型必须与游标变量所受限的记录类型匹配

3、关闭游标变量

  • 与关闭静态游标类似,均使用close语句直接关闭,释放查询所使用的内存空间
  • 关闭已关闭的游标是非法的

六、通过for循环遍历游标

  • 使用游标处理结果集时,可以配合使用FOR语句来完成
  • 使用FOR语句遍历游标中的数据时,可以把它的计时器看做一个自动的RECORD类型变量

(1)FOR语句遍历隐式游标中的数据时,通常在关键字 IN 后面提供由 SELECT 查询出的结果集,在检索结果集的过程中,ORACL 会自动提供一个隐式的游标SQL。
示例:使用隐式游标查询除JOB为 SALESMAN 的员工并输出

set serveroutput on
beginfor emp_record in(select empno,ename,sal from emp where job = 'SALESMAN') -- 遍历隐式游标中的记录loopdbms_output.put_line(emp_record.empno); --输出员工编号dbms_output.put_line(emp_record.ename); --输出员工姓名dbms_output.put_line(emp_record.sal);   --输出员工薪资end loop;
end ;
/

(2)使用显示游标时,IN 关键字后面提供游标名称
示例:检索emp表部门编号为30的员工并输出

set serveroutput on
declarecursor cur_emp is select * from emp where deptno = 30;
beginfor emp_record in cur_emp -- 遍历显示游标中的记录loopdbms_output.put_line(emp_record.empno); --输出员工编号dbms_output.put_line(emp_record.ename); --输出员工姓名dbms_output.put_line(emp_record.sal);   --输出员工薪资end loop;
end ;
/

ORACLE游标详解相关推荐

  1. oracle有哪两种内存结构,Oracle体系结构详解(物理构造,内存结构和逻辑结构)...

    当前位置:我的异常网» 数据库 » Oracle体系结构详解(物理构造,内存结构和逻辑结构 Oracle体系结构详解(物理构造,内存结构和逻辑结构) www.myexceptions.net  网友分 ...

  2. Oracle 存储过程详解(上)

    目录 一.存储过程与存储函数的定义 二.创建 / 执行存储过程所需的权限 1.resource权限 2.create.execute procedure权限 三.创建 / 执行存储过程 四.变量与参数 ...

  3. Oracle 体系结构详解

    Oracle 体系结构详解 什么是Orcale数据库? Orcale数据库(Oracle DateBase)是一款关系型数据库(这里就不多做介绍了),通常情况下,我们会把承载我们核心数据的系统通称为数 ...

  4. Oracle 错误代码详解

    Oracle 错误代码详解及解决方式–ORA ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常. ORA-00017: 请求会话以设置跟踪事 ...

  5. Oracle ASM 详解 收藏

    Oracle ASM 详解 ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案, ASM 和 RDBMS 非常相似,ASM 也 ...

  6. oracle分区表编程,Oracle分区表详解

    当前位置:我的异常网» 编程 » Oracle分区表详解 Oracle分区表详解 www.myexceptions.net  网友分享于:2013-10-28  浏览:25次 Oracle分区表详解 ...

  7. Oracle 冷备份详解【实战案例】

    Oracle 冷备份详解 --准备工作 select * from v$database; select file_name from dba_data_files; create tablespac ...

  8. oracle里面asm的作用,Oracle ASM 详解

    Oracle ASM 详解 ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案, ASM 和 RDBMS 非常相似,ASM 也 ...

  9. Oracle 数据字典详解

    Oracle 数据字典详解 什么叫数据字典? 数据字典指的是描述数据的数据. 举个例子:我们在数据库里面创建了一个表,这个表位于哪个数据文件.这个表有哪些列.这个表的每一个列的数据类型.这个表的约束等 ...

最新文章

  1. 引号快捷键_高效率的Excel-Ctrl类快捷键二
  2. Spring系列(十):@Autowired 和@Resource注解用法介绍
  3. 不可不知的CSS小技巧
  4. 互斥锁和条件变量【原创总结】
  5. java 拆箱 类型不对,Java基本类型于对象类型的拆箱和装箱
  6. 开源大数据周刊-第21期
  7. java静态接口方法使用_使用静态方法对接口进行Java编程
  8. 博图/博途(TIA)V13 V14 V15 V16 软件安装教程,适用于新手的傻瓜式安装方法,强推!!!!
  9. landsat 8 卫星 波段介绍 及组合
  10. linux网络Netfilter与iptables技术
  11. 软考-网络工程师-下午考试知识点
  12. 1. 查询表customer——查询姓名和联系人相同的顾客信息
  13. 武汉最牛批的互联网基本都在这了~
  14. AhMyth远程控制手机实验
  15. 国家也补贴?有华为认证证书的你,就能拿它(附详细操作)
  16. ③电子产品拆解分析-充电宝台灯
  17. 前端js以application/octet-stream方式上传文件
  18. wh 问句、祈使句、 感叹句
  19. 联通物联卡为什么没有网络_联通物联卡突然没有信号,试着用这几方法!
  20. CUE语言基础入门:CUE是一门为配置而生的语言

热门文章

  1. 加密保护软件 WinLicense 注册常见问题解答(三)
  2. 国内率先自主数字源表及IGBT测试系统亮相半导体分立器件年会
  3. python识别中文中的名字地点时间_在Python中解析带有timezone缩写名称的日期/时间字符串?...
  4. 定压补水装置 隔膜式定压补水装置
  5. 怎么用计算机截图快捷键,Win7系统怎么截图快捷键 5种Win7截图方法(图文教程)
  6. python编程:实现计算鸡兔同笼问题
  7. html计时节日,RIPRO美化-新年/高考/节日倒计时代码(小工具)
  8. 跨境物流费用该如何计算?
  9. NFS、FTP、SAMBA服务搭建
  10. Springboot毕设项目分布式生鲜市场信息系统设计与实现284o7java+VUE+Mybatis+Maven+Mysql+sprnig)