|
普通cursor与REF cursor还有一些大家应该都熟悉的区别,我再浪费点唾沫。 1)PL/SQL静态光标不能返回到客户端,只有PL/SQL才能利用它.ref光标能够被返回到客户端.这就是从Oracle的存储过程返回结果集的方式 2)PL/SQL静态光标可以是全局的,而ref光标则不是。 也就是说,不能在包说明或包体中的过程或函数之外定义ref光标。 只能在定义ref光标的过程中处理它,或返回到客户端应用程序. 3)ref光标可以从子例程传递到子例程,而光标则不能。 为了共享静态光标,必须在包说明或包体中把它定义为全局光标。 因为使用全局变量通常不是一种很好的编码习惯,因此可以用ref光标来共享PL/SQL中的光标,无需混合使用全局变量。 最后,使用静态光标--通过静态SQL(但不用ref光标)--比使用ref光标效率高,而ref光标的使用仅限于以下几种情况 把结果集返回给客户端 在多个子例程之间共享光标(实际上与上面提到的一点非常类似) 没有其他有效的方法来达到你的目标时,则使用ref光标,正如必须用动态SQL时那样 简言之,首先考虑使用静态SQL,只有绝对必须使用ref光标时才使用ref光标,也有人建议尽量使用隐式游标,避免编写附加的游标控制代码(声明,打开,获取,关闭),也不需要声明变量来保存从游标中获取的数据。这个就因人因具体的case大家去酌定吧。 游标属性
%FOUND: bool - TRUE if >1 row returned %NOTFOUND:bool - TRUE if 0 rows returned %ISOPEN: bool - TRUE if cursor still open %ROWCOUNT:int - number of rows affected by last SQL statement 注:NO_DATA_FOUND和%NOTFOUND的用法是有区别的,小结如下: 1)SELECT . . . INTO 语句触发 NO_DATA_FOUND; 2)当一个显式光标的 where 子句未找到时 触发 %NOTFOUND; 3)当UPDATE或DELETE 语句的where 子句未找到时 触发 SQL%NOTFOUND; 4)在光标的提取(Fetch)循环中要用 %NOTFOUND 或%FOUND 来确定循环的退出条件,不要用NO_DATA_FOUND。 本小节就罗嗦这么多,更多进一步的资料,参考Oracle pl/sql开发手册吧。
|