隐式游标

隐式游标是通过PLOSCAR管理并控制的游标,每次在执行一个SELECT或者DML语句时,PLOSCAR都会提供一个隐式游标。

虽然用户不能控制隐式游标,但是可以通过隐式游标的属性值来获取隐式游标的信息;

SQL%attribute总是引用到最近的SELECT语句或DML语句;如果没有这样的语句执行,那么SQL%attribute的返回值为NULL;

隐式游标在和他相关联的语句退出时会自动关闭,但是知道有其他的SELECT语句或DML语句运行时,其属性值依然存在。

最近的相关联的SELECT语句和DML语句可能不在同一个域内,为了以后的使用,可以将属性值直接保存在局部变量中,否则在用户测试或使用之前,其他的操作,比如子程序的调用,可能会更改当前的属性值。

语法:

SQL%attribute;

参数:

attribute 隐式游标的属性

说明:

隐式游标的属性主要有以下几种:

SQL%ISOPEN Attribute:游标是否打开

由于在与之相关联的语句被执行完后,隐式游标总是处于关闭状态,因此它的返回值总是FALSE;

SQL%FOUND Attribute: 是否有结果被提取

  1. 如果没有SELECT语句或者DML语句执行,其返回值为NULL;
  2. 如果SELECT语句能够返回一行或多行结果,或者DML语句能够作用于一行或多行上,其返回值为TRUE;
  3. 上述之外的情况下,其返回值为FALSE;

SQL%NOTFOUND Attribute: 是否没有结果被提取

  1. 如果没有SELECT或者DML语句执行,那么其返回值为NULL;
  2. 如果SELECT语句能够返回一行或多行结果,或者DML语句能够作用于一行或多行上,其返回值为FALSE;
  3. 上诉之外的其他情况,其返回值为TRUE;

由于以下原因,SQL% NOTFOUND不适合用于SELECT INTO语句:

  1. 由于SELECT INTO语句并不返回结果集,因此在用户检测SQL% NOTFOUND值之前,PLOSCAR会直接抛出预定义的异常;
  2. 调用聚合函数的SELECT INTO语句通常会返回一个值,有可能是NULL;在执行完这样的语句之后,SQL% NOTFOUND总是FALSE,此时的检测是不必要的。

SQL%ROWCOUNT Attribute:提取结果的行数

  1. 如果没有SELECT或者DML语句执行,那么其返回值为NULL;
  1. 其他情况下,其返回值为SELECT语句或者DML语句所返回的结果集的具体行数。

SQL%ROWCOUNT的值和事务状态无关,因此需要特别注意以下两种情况:

  1. 当一个事务回退至保存点时,SQL%ROWCOUNT的值并不会回退至它在相应保存点之前所具有的值。
  1. 当一个独立的事务结束时,SQL%ROWCOUNT的值并不会恢复到上一个事务时其所具有的值。

隐式游标属性

隐式游标是PL/SQL内预定义的一个游标对象,被PL/SQL自动管理,用户可以从游标的属性追踪当前执行信息。隐式游标无需显式声明,可以认为隐式游标的名字为SQL,过程结束自动删除,它返回DML和DDL语句执行的信息,如INSERT、UPDATE、DELETE、SELECT INTO、COMMIT和ROLLBACK。隐式游标的属性值总是当前执行的PL/SQL最近一次执行的信息,包括子过程调用。

隐式游标都包含4个属性:%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT。

SQL%FOUND

在一个数据操纵语句被执行前,SQL%FOUND的值为NULL。执行后,当INSERT、DELETE、UPDATE语句影响一行或多行时,亦或是SELECT INTO语句返回一行或多行,它的值为TRUE,否则值为FALSE。

SQL%NOTFOUND

SQL%NOTFOUND的值和SQL%FOUND在同一次执行完后是相反的。

SQL%ISOPEN

在执行完语句之后都会自动关闭隐式游标,所以SQL%ISOPEN一直都是FALSE。

SQL%ROWCOUNT

SQL%ROWCOUNT的值反映的是INSERT、DELETE、UPDATE语句影响的行数,或是SELECT INTO语句返回的行数,如果没有影响或返回的行,它的值为0。