oracle 游标

1.用for遍历游标,不必打开、关闭游标。for自动控制。

创建使用游标的存储过程,

create or replace procedure pro_dff_cursor(sex1 varchar)

as

--定义游标

cursor test_cursor is

select id,name,age,sex from table where sex = sex1;

cur test_cursor %rowtype; --cur为结果集的一条数据,跟java中list的对象相似,这里定义了游标的类型。List<Object>

begin

 for cur in test_cursor loop

 exit when test_cursor %notfound;

 dbms_output.print_line('id:'||cur.id||',name:'||cur.name||',age:'||cur.age||',sex:'||cur.sex);

 end loop;

end;

===========================================================================================

  上边,首先看Cursor test_cursor is 这一行,它的意思是定义一个游标,test_cursor 为你要定义的名字,而is 后边是一个sql,也就是说当前这个sql的查询结果,赋值给游标test_cursor 。
  然后,往下,接着cur test_cursor%rowtype ,这个是定义了一个类型,而这个类型,即是游标test_cursor 的返回结果类型,类型的名字为cur 。有点类似于java语言 中List 集合中的一个泛型 。
  另外,关于for 是一个循环的写法,for cur in test_cursor ,即,从游标test_cursor 中取出一个结果cur 。
  还有,注意,loop 和end loop 这是一个循环的开始标志和结束标志,但它俩兄弟是一个很执着的循环,如果没有定义退出条件,永远不会退出的,所以在上边的循环里边,有了退出条件exit when test_cursor%notfound; ,即当游标test_cursor 中没有数据了,就退出循环。
  当然loop 循环的退出,发生下边的情况,才能退出:

  有exit,并满足条件后退出。
  loop中抛出了异常。
  存在goto 标识。

2.上述红字部分替换循环方式

a.Fetch 循环

open test_cursor; --需要明确打开游标

loop

 fetch test_cursor into cur;

 exit when test_cursor%notfound;

 dbms_output.print_line('id:'||cur.id||',name:'||cur.name||',age:'||cur.age||',sex:'||cur.sex); --循环体

end loop;

close test_cursor; --关闭游标

b.While循环

open test_cursor;

while test_cursor%notfound loop 

fetch test_cursor into cur ;

dbms_output.print_line('id:'||cur.id||',name:'||cur.name||',age:'||cur.age||',sex:'||cur.sex); --循环体

close test_cursor;

posted @ 2019-02-14 15:41  Oath_keeper  阅读(123)  评论(0编辑  收藏  举报