PL/SQL 游标

概述

  SQL是面向集合的,它的结果也是集合量(多条记录),然而PL/SQL的变量一般是标量,其一组变量一次只能存放一条记录。所以仅仅使用变量并不能满足SQL语句向应用程序输出数据的要求。因为查询的结构的记录数是不确定的,不知道声明几个变量。因此,在PL/SQL中引入了游标(Cursor)的概念来协调这两种不同的处理方式。

  PL/SQL在执行SQL语句时,oracle会在内存中为其分配一个缓冲区来存放这些数据,而获取这些数据就需要一个指针来指向这个缓冲区,这个指针就是游标,通过对游标数据进行提取,指针游标就会自动向下移动。

  游标分为显示游标和隐式游标,使用游标的时候会使用到一些游标属性,在最后说明。

显示游标

  显示游标有4个步骤,分别是 声明游标、打开游标、提取游标、关闭游标。其操作过程如下:

graph LR
start[声明游标] --> two[打开游标]
two --> three[提取游标]
three --> conditionA{空?}
conditionA -- 否 --> three
conditionA -- 是 --> result[关闭游标]
1.声明游标

  游标的声明需要在DECLARE(这个时候只是声明不执行),语法为

CURSOR <游标名> IS <SQL语句>
2.打开游标

  打开游标其实就是执行sql语句,并将执行结构放到缓冲区,执行打开游标时会执行一下几件事情。

  • 检查变量的取值
  • 根据变量的取值,确定结果集
  • 结果集的指针(游标)指向第一行
OPEN <游标名>
3.提取游标

  提取游标就是从游标指向的缓冲区提取数据,使用的就是FETCH,每提取一个值游标指针就会向下移动一行。它的语法就是:

FETCH <游标名> INTO <变量名列表>;
FETCH <游标名> INTO PL/SQL记录;
4.关闭游标

  当所有的活动集都被检索之后,游标就应该被关闭,PL/SQL被告知游标的处理已经结束,然后就会将游标关联的资源进行释放。语法如下:

CLOSE <游标名>
举例
-- Created on 2019/12/10 by YXQPC 
-- 显示游标测试
declare 
   -- 定义一个参数数据库中isenable参数
   enable_var CHAR(1):=0;
   uuid_var VARCHAR2(100);
   adnm_var VARCHAR2(100);
  -- 声明一个游标(这个时候的sql语句是不执行的,只是定义声明),参数是用来传递到SQL语句的
  CURSOR testData(enableData INT) IS SELECT UUID,AD_NM FROM test WHERE IS_ENABLE=enableData; 
begin
  -- 打开游标(其实就是执行sql语句,并将数据放到缓冲中,指定指针指向该缓冲)
  --OPEN testData;
  LOOP
    -- 判断是否打开了游标
    IF testData %ISOPEN THEN 
       -- %NOTFOUND 没有发现要操作的行或者%ROWCOUNT操作到第二行,说明游标已经移到了最后了。
      EXIT WHEN testData%NOTFOUND OR testData%ROWCOUNT>=2;
      -- 提取游标数据(这个表里面就一个字段)
      FETCH testData INTO uuid_var,adnm_var;
    ELSE 
      -- 获取isEnable数据为0的数据
      OPEN testData(enable_var);
    END IF;
  END LOOP;
  -- 释放资源
  CLOSE testData;
end;

隐式游标

  如果在PLSQL中直接执行SQL语句,则隐式的使用了游标,也就是隐式游标,这种游标无需进行定义,也不需要打开和关闭。

  对于每个隐式游标来说,必须要有一个INTO子句,因此使用隐式游标的SQL语句必须只选中一行数据或者产生一行语句。

例如
-- Created on 2019/12/10 by YXQPC 
-- 隐式游标测试
declare 
  -- 定义一个字段
   uuid_var VARCHAR2(100);
   adnm_var VARCHAR2(100);
begin
  -- 隐式游标就是直接SELECT语句进行获取数据
  -- 使用隐式游标必须只能选中一行数据,不能获取多行数据
  -- 使用INTO将数据传输到变量中
  SELECT UUID,AD_NM INTO uuid_var,adnm_var FROM test WHERE UUID='0d19ea1d2c05414b906dceae2bc94001';
end;

游标属性

  无论是显示游标还是隐式游标,都有%ISOPEN,%FOUND,%NOTFOLJND,%ROWCOUNT四种属性。他们描述与游标操作相关的DML语句的执行情况。游标属性只能用在PLSQL的流程控制语句内,而不能用在SQL语句内。

1.是否找到游标 %FOUND

  该属性表示当前游标是否指向有效的一行,是则为TRUE,否则为FALSE。因此该属性可以判断是否结束游标的使用。

  示例请查看显示游标例子

2.是否没有找到游标 %NOTFOUND

  和%FOUND正好相反。

  示例请查看显示游标例子

3.游标行数 %ROWCOUNT

  该属性记录了游标抽取过的记录行数,也是可以理解为游标当前所在的行号。这个属性在循环判断中很有效,可以不必抽取所有记录行就可以终端游标操作。

  示例请查看显示游标例子

4.是否打开游标 %ISOPEN

  该属性表示游标是否处于打开的状态。使用一个游标的使用,往往需要进行检查该游标是否已经打开了。

  示例请查看显示游标例子

5.参数化游标

  在定义游标的时候可以带上参数,这些个参数可以传递到SQL语句中用来做条件,方便达到动态根据条件筛选数据的效果。

  示例请查看显示游标例子

游标变量

  这个地方需要另外研究

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值