oracle中cursor与refcursor及sysrefcursor的区别

上传人:平*** 文档编号:13360333 上传时间:2017-10-23 格式:DOCX 页数:7 大小:27.73KB
返回 下载 相关 举报
oracle中cursor与refcursor及sysrefcursor的区别_第1页
第1页 / 共7页
oracle中cursor与refcursor及sysrefcursor的区别_第2页
第2页 / 共7页
oracle中cursor与refcursor及sysrefcursor的区别_第3页
第3页 / 共7页
oracle中cursor与refcursor及sysrefcursor的区别_第4页
第4页 / 共7页
oracle中cursor与refcursor及sysrefcursor的区别_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《oracle中cursor与refcursor及sysrefcursor的区别》由会员分享,可在线阅读,更多相关《oracle中cursor与refcursor及sysrefcursor的区别(7页珍藏版)》请在金锄头文库上搜索。

1、一、显式 cursor 显式是相对与隐式 cursor 而言的,就是有一个明确的声明的 cursor。显式游标的声明类似如下(详细的语法参加 plsql ref doc ): cursor cursor_name (parameter list) is select . 游标从 declare、open 、fetch、close 是一个完整的生命旅程。当然了一个这样的游标是可以被多次 open 进行使用的,显式 cursor 是静态 cursor,她的作用域是全局的,但也必须明白,静态 cursor 也只有 pl/sql 代码才可以使用她。下面看一个简单的静态显式 cursor 的示例: de

2、clare cursor get_gsmno_cur (p_nettype in varchar2) is select gsmno from gsm_resource where nettype=p_nettype and status=0; v_gsmno gsm_resource.gsmno%type; begin open get_gsmno_cur(139); loop fetch get_gsmno_cur into v_gsmno; exit when get_gsmno_cur%notfound; dbms_output.put_line(v_gsmno); end loop;

3、 close emp_cur; open get_gsmno_cur(138); loop fetch get_gsmno_cur into v_gsmno; exit when get_gsmno_cur%notfound; dbms_output.put_line(v_gsmno); end loop; close get_gsmno_cur; end; / 上面这段匿名块用来实现选号的功能,我们显式的定义了一个 get_gsmno_cur,然后根据不同的号段输出当前系统中该号短对应的可用手机号码。当然了,实际应用中没人这么用的,我只是用来说应一个显式 cursor 的用法。引用 二、隐式

4、 cursor 隐式 cursor 当然是相对于显式而言的,就是没有明确的 cursor 的 declare。在 Oracle 的PL/SQL 中,所有的 DML 操作都被 Oracle 内部解析为一个 cursor 名为 SQL 的隐式游标,只是对我们透明罢了。 另外,我们前面提到的一些循环操作中的指针 for 循环,都是隐式 cursor。 隐式 cursor 示例一: CREATE TABLE zrp (str VARCHAR2(10); insert into zrp values (ABCDEFG); insert into zrp values (ABCXEFG); insert

5、into zrp values (ABCYEFG); insert into zrp values (ABCDEFG); insert into zrp values (ABCZEFG); COMMIT; SQL begin 2 update zrp SET str = updateD where str like %D%; 3 ifSQL%ROWCOUNT= 0 then 4 insert into zrp values (1111111); 5 end if; 6 end; 7 / PL/SQL procedure successfully completed SQL select * f

6、rom zrp; STR - updateD ABCXEFG ABCYEFG updateD ABCZEFG SQL SQL begin 2 update zrp SET str = updateD where str like %S%; 3 ifSQL%ROWCOUNT= 0 THEN 4 insert into zrp values (0000000); 5 end if; 6 end; 7 / PL/SQL procedure successfully completed SQL select * from zrp; STR - updateD ABCXEFG ABCYEFG updat

7、eD ABCZEFG 0000000 6 rows selected SQL 隐式 cursor 示例二: begin for rec in (select gsmno,status from gsm_resource) loop dbms_output.put_line(rec.gsmno|-|rec.status); end loop; end; / 引用 三、REFcursor Ref cursor 属于动态 cursor(直到运行时才知道这条查询)。 从技术上讲,在最基本的层次静态 cursor 和 ref cursor 是相同的。一个典型的 PL/SQL 光标按定义是静态的。Ref

8、光标正好相反,可以动态地打开,或者利用一组 SQL 静态语句来打开,选择哪种方法由逻辑确定(一个 IF/THEN/ELSE 代码块将打开一个或其它的查询) 。例如,下面的代码块显示一个典型的静态 SQL 光标,光标 C。此外,还显示了如何通过使用动态 SQL 或静态 SQL 来用 ref 光标(在本例中为 L_CURSOR)来打开一个查询: Declare type rc is ref cursor; cursor c is select * from dual; l_cursor rc; begin if (to_char(sysdate,dd) = 30) then - ref curso

9、r with dynamic sql open l_cursor for select * from emp; elsif (to_char(sysdate,dd) = 29) then - ref cursor with static sql open l_cursor for select * from dept; else - with ref cursor with static sql open l_cursor for select * from dual; end if; - the normal static cursor open c; end; / 在这段代码块中,可以看到

10、了最显而易见的区别:无论运行多少次该代码块,光标 C 总是select * from dual。相反,ref 光标可以是任何结果集,因为select * from emp字符串可以用实际上包含任何查询的变量来代替。 在上面的代码中,声明了一个弱类型的 REF cursor,下面再看一个强类型(受限)的REF cursor,这种类型的 REF cursor 在实际的应用系统中用的也是比较多的。 create table gsm_resource ( gsmno varchar2(11), status varchar2(1), price number(8,2), store_id varcha

11、r2(32) ); insert into gsm_resource values(13905310001,0,200.00,SD.JN.01); insert into gsm_resource values(13905312002,0,800.00,SD.JN.02); insert into gsm_resource values(13905315005,1,500.00,SD.JN.01); insert into gsm_resource values(13905316006,0,900.00,SD.JN.03); commit; SQL declare 2 type gsm_rec

12、 is record( 3 gsmno varchar2(11), 4 status varchar2(1), 5 price number(8,2); 6 7 type app_ref_cur_type is ref cursor return gsm_rec; 8 my_cur app_ref_cur_type; 9 my_rec gsm_rec; 10 11 begin 12 open my_cur for select gsmno,status,price 13 from gsm_resource 14 where store_id=SD.JN.01; 15 fetch my_cur

13、into my_rec; 16 while my_cur%found loop 17 dbms_output.put_line(my_rec.gsmno|#|my_rec.status|#|my_rec.price); 18 fetch my_cur into my_rec; 19 end loop; 20 close my_cur; 21 end; 22 / 13905310001#0#200 13905315005#1#500 PL/SQL procedure successfully completed SQL 普通 cursor 与 REF cursor 还有一些大家应该都熟悉的区别,

14、我再浪费点唾沫。 1)PL/SQL 静态光标不能返回到客户端,只有 PL/SQL 才能利用它。 ref 光标能够被返回到客户端,这就是从 Oracle 的存储过程返回结果集的方式。 2)PL/SQL 静态光标可以是全局的,而 ref 光标则不是。 也就是说,不能在包说明或包体中的过程或函数之外定义 ref 光标。 只能在定义 ref 光标的过程中处理它,或返回到客户端应用程序。 3)ref 光标可以从子例程传递到子例程,而光标则不能。 为了共享静态光标,必须在包说明或包体中把它定义为全局光标。 因为使用全局变量通常不是一种很好的编码习惯,因此可以用 ref 光标来共享 PL/SQL 中的光标,

15、无需混合使用全局变量。 最后,使用静态光标-通过静态 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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号