Oracle游标简介与使用

简介

游标是一个指向查询结果集的指针,PL/SQL有两种游标,分别是显式游标和隐式游标。

隐式游标

当Oracle执行 SELECT INTOINSERTUPDATEDELETE SQL语句时,它会自动的创建一个隐式游标,Oracle内部管理整个隐式游标的整个执行周期,并且只暴漏出游标的信息和状态,例如:SQL%ROWCOUNTSQL%ISOPENSQL%FOUNDSQL%NOTFOUND。当查询返回零行或多行时,隐式游标不够优雅,这会分别导致NO_DATA_FOUNDTOO_MANY_ROWS异常。

显示游标

显式游标是在当前块或包规范的声明部位中显式声明的SELECT语句。你可以控制显式游标的整个执行周期从OPENFETCHCLOSE。Oracle定义了一个执行周期来执行SQL语句并将游标与之关联。

1.声明一个游标

在使用显式游标之前,你必须声明它。

CURSOR cursor_name IS query

上句中,首先在CURSOR关键字之后指定了游标的名字,然后在IS关键字后定义了一个获取数据的查询。

2.打开游标

在开始从游标中获取行之前,你必须先打开游标,你可以使用下面的语法来打开游标。

OPEN cursor_name

在这句话中,cursor_name是在声明部分所声明游标的名字。

当你打开游标,Oracle会解析查询,绑定变量并且执行所关联的SQL语句。Oracle也决定了执行计划,将变量和游标参数与SQL语句中的占位符相关联,确定结果集,并将游标设置到结果集中的第一行。

3.从游标中获取数据

FETCH将游标所指向的当前行放置到变量中,语法如下

FETCH cursor_name INTO variable_list

为了获取结果集中的所有行,你必须使用FETCH获取每一行直至最后一行。

4.关闭游标

在获取到所有行之后,你必须使用CLOSE语句关闭游标。

CLOSE cursor_name

关闭游标会使Oracle在适当的时机释放所占用的内存。

如果你在匿名块、存储过程或者函数中声明游标,在这些对象执行结束时游标也会自动的关闭。

5.显示游标的属性

一个游标有四个属性,你可以使用以下语法来引用他们

cursor_name%attrribute

cursor_name是显式游标的名称

%ISOPEN

如果游标打开了,该属性就为TRUE否则为FALSE

%FOUND

这个属性有四个值

  • NULL:在第一次获取数据之前
  • TRUE:一条记录成功的被获取到
  • FALSE:没有记录返回
  • INVALID_CURSOR:游标没有打开

%NOTFOUND

这个属性也有四个值

  • NULL:在第一次获取数据之前
  • FALSE:一条记录成功的被获取到
  • TRUE:没有记录返回
  • INVALID_CURSOR:游标没有打开

%ROWCOUNT

该属性反悔了从游标中获取的记录数,若游标未打开,则该属性返回INVALID_CURSOR

示例

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;
           --判读是否提取到值,没取到值就退出
           --取到值c_job%notfound 是false 
           --取不到值c_job%notfound 是true
           exit when c_job%notfound;
            dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
         end loop;
       --关闭游标
      close c_job;
end;

参考:https://www.oracletutorial.com/plsql-tutorial/plsql-cursor/

原文地址:https://www.cnblogs.com/MrZhaoyx/p/13389505.html