今天简单的总结一下PL/SQL中cursor(光标/游标)的用法.
相信不少做开发或维护的DBA在工作的时候,遇到过类似的面视问题:请简单的描述一下光标的类型,说一下普通光标和REF光标之间的区别,以及什么时候该正确应用哪一个?
这个题目,我着实难住了不少人,其实他们在具体开发的时候,也还是比较能够把握正确的光标的使用的,但就是说不出来,当然了,这与大家自身的沟流交通能力是有关系的。有的人不善于说,但做的却很好。扯的扯就走远了,最后唠叨一下:做技术这条路,能干不能说,或者说会干不会包装,路是走不"远"的.
显式cursor
显式是相对与隐式cursor而言的,就是有一个明确的声明的cursor.显式游标的声明类似如下(详细的语法参加plsql ref doc )
cursor cursor_name (parameter list) is select ...
游标从declare、open、fetch、close是一个完整的生命旅程。当然了一个这样的游标是可以被多次open进行使用的,显式cursor是静态cursor,她的作用域是全局的,但也必须明白,静态cursor也只有pl/sql代码才可以使用她。下面看一个简单的静态显式cursor的示例:
declare
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;
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的用法。
隐式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 into zrp values ('ABCYEFG');
insert into zrp values ('ABCDEFG');
insert into zrp values ('ABCZEFG');
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 * from zrp;
STR
----------
updateD
ABCXEFG
ABCYEFG
ABCZEFG
SQL>
SQL> begin
2 update zrp SET str = 'updateD' where str like '%S%';
oracle游标的使用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
----------
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论