Thomas Zhang的杂货铺
24 06, 2008
编写健壮的PL/SQL代码(六)
作者 tomszrp 12:47 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 解决方案

普通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开发手册吧。


Comments
博客日历
« 八月 2008 »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
搜索
最新发表
文章分类
文章归档
网站链接
新闻聚合