首页 > 代码库 > cursor
cursor
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;
cursor
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。