隐式游标¶
隐式游标是通过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: 是否有结果被提取
- 如果没有SELECT语句或者DML语句执行,其返回值为NULL;
- 如果SELECT语句能够返回一行或多行结果,或者DML语句能够作用于一行或多行上,其返回值为TRUE;
- 上述之外的情况下,其返回值为FALSE;
SQL%NOTFOUND Attribute: 是否没有结果被提取
- 如果没有SELECT或者DML语句执行,那么其返回值为NULL;
- 如果SELECT语句能够返回一行或多行结果,或者DML语句能够作用于一行或多行上,其返回值为FALSE;
- 上诉之外的其他情况,其返回值为TRUE;
由于以下原因,SQL% NOTFOUND不适合用于SELECT INTO语句:
- 由于SELECT INTO语句并不返回结果集,因此在用户检测SQL% NOTFOUND值之前,PLOSCAR会直接抛出预定义的异常;
- 调用聚合函数的SELECT INTO语句通常会返回一个值,有可能是NULL;在执行完这样的语句之后,SQL% NOTFOUND总是FALSE,此时的检测是不必要的。
SQL%ROWCOUNT Attribute:提取结果的行数
- 如果没有SELECT或者DML语句执行,那么其返回值为NULL;
- 其他情况下,其返回值为SELECT语句或者DML语句所返回的结果集的具体行数。
SQL%ROWCOUNT的值和事务状态无关,因此需要特别注意以下两种情况:
- 当一个事务回退至保存点时,SQL%ROWCOUNT的值并不会回退至它在相应保存点之前所具有的值。
- 当一个独立的事务结束时,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。