游标是指向这一上下文的区域。 PL/SQL通过控制光标在上下文区域。游标持有的行(一个或多个)由SQL语句返回。行集合光标保持的被称为活动集合。

可以命名一个光标,它可以在程序中获取和处理SQL语句,一次返回的行引用。有两种类型的游标:

  • 隐式游标
  • 显式游标

隐式游标

Oracle在一个SQL语句的执行,当没有显式游标的语句隐式游标时自动创建。程序员无法控制隐式游标其中的信息。

每当发出一个DML语句(INSERT,UPDATE和DELETE),隐式游标与此语句关联。对于INSERT操作时,光标保持一个需要插入的数据。对于UPDATE和DELETE操作,光标标识会受到影响的行。

在PL/SQL,可以参考最近的隐式游标的SQL游标,它有类似%FOUND,%ISOPEN,%NOTFOUND,和%ROWCOUNT属性。在SQL游标有额外的属性,%BULK_ROWCOUNT和%BULK_EXCEPTIONS,设计用于所有语句中使用。下表提供了最常用的属性的描述:

属性

描述

%FOUND

返回TRUE如果一个INSERT,UPDATE或DELETE语句影响了一行或多行或SELECT INTO语句返回一行或多行。否则,它将返回FALSE。

%NOTFOUND

逻辑相反%FOUND。返回TRUE如果一个INSERT,UPDATE或DELETE语句影响没有行或SELECT INTO语句返回任何行。否则,它将返回FALSE。

%ISOPEN

隐式游标总是返回FALSE,因为Oracle执行其相关的SQL语句之后自动关闭SQL游标。

%ROWCOUNT

返回受INSERT,UPDATE影响的行数,或DELETE语句,或者通过一个SELECT INTO语句返回。

任何SQL游标属性将被访问,SQL%attribute_name如示例图所示。

以表emp为操作对象,操作前:

PL/SQL游标---隐式游标操作实例_sql%rowcount

隐式游标使用实例源码窗口截图:

PL/SQL游标---隐式游标操作实例_PL/SQL游标_02

隐式游标使用实例源码:

-- Created on 2018/3/29 by E.WANG 
/*
Oracle在一个SQL语句的执行,当没有显式游标的语句隐式游标时自动创建。
程序员无法控制隐式游标其中的信息。
每当发出一个DML语句(INSERT,UPDATE和DELETE),隐式游标与此语句关联。
对于INSERT操作时,光标保持一个需要插入的数据。
对于UPDATE和DELETE操作,光标标识会受到影响的行。
在PL/SQL,可以参考最近的隐式游标的SQL游标,它有类似%FOUND,%ISOPEN,%NOTFOUND,和%ROWCOUNT属性。
在SQL游标有额外的属性,%BULK_ROWCOUNT和%BULK_EXCEPTIONS,设计用于所有语句中使用。
*/
declare
--用于保存更改的行数
countRows integer;
begin
--更新表emp给每个员工减一千元
update emp set sal=sal-1000;

--使用隐式游标SQL%NOTFOUND
--如果为true说明对元数据没有变化
if sql%notfound then
dbms_output.put_line('no employee update');
--使用隐式游标SQL%FOUND
--如果为true说明对元数据有变化
elsif sql%found then
--%rowcount用于保存受影响的行数
countRows:=sql%rowcount;
dbms_output.put_line(countRows ||' employee update');
end if;

end;

运行结果截图:

PL/SQL游标---隐式游标操作实例_sql%rowcount_03