标签:
cursor
一、分类:
静态游标
显式游标(需要明确定义)
隐式游标(所有dml语句都为隐式游标,for循环也是隐式游标)
ref游标 (尽量不用ref游标,ref游标可在程序间传递数据集)
强类型ref游标(定义中有返回值)
弱类型ref游标(定义中无返回值)
二、游标的几个状态值:(%前接游标类型的变量)
%found
%notfound
%isopen
%rowcount:当前游标遍历到的行值
三、粗暴的定义:用于遍历查询结果集,从而依次对结果集中的行做出相关操作;
四、各种游标简单实例
--显式游标---------------------- --loop循环 declare cursor test_cursor is select * from dept; test_ dept%rowtype;--也可写为test_ test_cursor%rowtype;【此时test_cursor被看做一个结果集?】 begin if test_cursor%isopen then close test_cursor; end if; open test_cursor; loop fetch test_cursor into test_; exit when test_cursor%notfound; dbms_output.put_line(test_.deptno); end loop; dbms_output.put_line(test_cursor%rowcount); close test_cursor; end; --隐式游标---------------------- --for循环 declare cursor test_cursor is select * from dept; --test_ test_cursor%rowtype;--这一段可忽略,游标变量在for循环中可直接使用,可不需要定义 begin for test_ in test_cursor loop dbms_output.put_line(test_.loc); end loop; end; /* 注: for游标可不定义游标类型变量 for后接的就是游标类型变量 */ --DML(update,insert,delete) begin update test_trans01 set b=111 where a=‘a‘; if sql%rowcount<>0 then dbms_output.put_line(sql%rowcount||‘行被更新!‘); end if; end; --强类型ref游标---------------------- declare type test_cursor is ref cursor return test_trans01%rowtype; test_ test_cursor; test__ test_%rowtype; begin open test_ for select * from test_trans01; loop fetch test_ into test__; exit when test_%notfound; dbms_output.put_line(test__.a); end loop; close test_; end; --弱类型ref游标---------------------- declare type test_cursor is ref cursor; test_ test_cursor; --test__ test_%rowtype;【这样应用会报错】 test__ dept%rowtype; begin open test_ for select * from dept; loop fetch test_ into test__; exit when test_%notfound; dbms_output.put_line(test__.dname); end loop; close test_; end; --应用实例---------------------- --for update/delete【用于修改或删除表中数据】 declare cursor test_cursor is select * from test_trans01 for update;-- begin for test_ in test_cursor loop dbms_output.put_line(test_.a); if test_.a=‘a‘ then update test_trans01 set b=1111 where current of test_cursor; dbms_output.put_line(test_.a||‘被更新!‘); else null; end if; end loop; end; --带参数的显示游标 --暂时未发现可用之处,或许可用在复杂的语句块中,接收条件判定生成的参数,但讲参数直接写在where后是一样的效果。。? declare cursor test_cursor(dd number :=2) is select * from test_trans01 where b>dd;--参数变量不能限定范围 test_ test_cursor%rowtype; begin open test_cursor; loop fetch test_cursor into test_; exit when test_cursor%notfound; dbms_output.put_line(test_.b); end loop; close test_cursor; end;
标签:
原文地址:http://www.cnblogs.com/heibaitan/p/4204649.html