oracle游标cursor简单使用

举报
小傅哥 发表于 2021/04/22 23:31:56 2021/04/22
【摘要】 总共介绍两种游标一种高效使用游标cursor 、sys_refcursor 、 bulk collect    1、cursor游标使用 /*简单cursor游标 *students表里面有name字段,你可以换做其他表测试 */--定义declare --定义游标并且赋值(is 不能和cursor分开使用) cursor stus_cur is select * fr...

总共介绍两种游标一种高效使用游标cursor sys_refcursor bulk collect 

 

1、cursor游标使用


      /*简单cursor游标
       *students表里面有name字段,你可以换做其他表测试
       */
      --定义
      declare
      --定义游标并且赋值(is 不能和cursor分开使用)
      cursor stus_cur is select * from students;
      --定义rowtype
       cur_stu students%rowtype;
      /*开始执行*/
      begin
        --开启游标
        open stus_cur;
      --loop循环
       loop
      --循环条件
       exit when stus_cur%notfound;
      --游标值赋值到rowtype
       fetch stus_cur into cur_stu;
      --输出
       dbms_output.put_line(cur_stu.name);
      --结束循环 
      end loop;
      --关闭游标 
         close stus_cur;
       /*结束执行*/
      end;
  
 

执行结果


      SQL> declare
       2   --定义游标并且赋值(is 不能和cursor分开使用)
       3   cursor stus_cur is select * from students;
        4   --定义rowtype
        5   cur_stu students%rowtype;
        6   /*开始执行*/
        7   begin
       8 --开启游标
       9 open stus_cur;
       10 --loop循环
       11 loop
       12 --循环条件
       13 exit when stus_cur%notfound;
       14 --游标值赋值到rowtype
       15 fetch stus_cur into cur_stu;
       16 --输出
       17 dbms_output.put_line(cur_stu.name);
       18 --结束循环
       19 end loop;
       20 --关闭游标
       21 close stus_cur;
       22 /*结束执行*/
       23   end;
       24  /
      杨过
      郭靖
      付政委
      刘自飞
      江风
      任我行
      任盈盈
      令狐冲
      韦一笑
      张无忌
      朵儿
      谢逊
      小龙女
      欧阳锋
      欧阳锋
  
 

2、sys_refcursor游标使用


      /*
       *游标名:sys_refcursor
       *特别注意赋值方式:for
       *与上重复内容不在叙述
       */
      declare
         stu_cur sys_refcursor;
         stuone students%rowtype;
        begin
      --这句赋值方式for
      open stu_cur for select * from students;
      --fetch赋值给rowtype
       fetch stu_cur into stuone;
       loop
       dbms_output.put_line(stuone.name||' '||stuone.hobby);
       fetch stu_cur into stuone;
       exit when stu_cur%notfound;
      end loop;
        end;
  
 


执行结果


      SQL> /*
       2 *游标名:sys_refcursor
       3 *特别注意赋值方式:for
       4 *与上重复内容不在叙述
       5 */
        6  declare
       7 stu_cur sys_refcursor;
        8 stuone students%rowtype;
        9
       10 begin
      11 --这句赋值方式for
      12 open stu_cur for select * from students;
       13 --fetch赋值给rowtype
       14 fetch stu_cur into stuone;
       15
       16 loop
       17 dbms_output.put_line(stuone.name||' '||stuone.hobby);
       18 fetch stu_cur into stuone;
       19 exit when stu_cur%notfound;
       20 end loop;
       21 end;
       22  /
      杨过 保护小龙女
      郭靖 修炼降龙十八掌
      付政委 看小人书
      刘自飞 编程写代码
      江风 编程写代码
      任我行 修炼神功
      任盈盈 游山玩水
      令狐冲 行侠仗义
      韦一笑 吸拾人雪
      张无忌 修行
      朵儿 洗浴
      谢逊 毕生研究屠龙刀
      小龙女 修炼玉女心经
      欧阳锋 看小人书
  
 


补充一种循环条件


      declare
         stu_cur sys_refcursor;
         stuone students%rowtype;
        begin
      open stu_cur for select * from students;
       fetch stu_cur into stuone;
      --特别注意循环条件的改变
      --这个条件是发现了在循环
      --与上一个notfound不同的
       while stu_cur%found loop
       dbms_output.put_line(stuone.name||' '||stuone.hobby);
       fetch stu_cur into stuone;
      end loop;
        end;
  
 

 

--普通的fetch into


      /*普通方式*/
      declare
      cursor myemp_cur is select * from myemp;
      v_myemp myemp%rowtype;
      begin
       open myemp_cur;
        fetch myemp_cur into v_myemp;
        while myemp_cur%found loop
       dbms_output.put_line(v_myemp.ename);
       fetch myemp_cur into v_myemp;
       end loop;
      end;
  
 


 --高效的bulk collect


      /*高效bulk collect for*/
      declare
      cursor myemp_cur
      is select * from myemp;
      type myemp_tab is table of myemp%rowtype;
      myemp_rd myemp_tab;
      begin
       open myemp_cur;
        loop
       fetch myemp_cur bulk collect into myemp_rd limit 20;
       for i in 1..myemp_rd.count loop
       dbms_output.put_line('姓名:'||myemp_rd(i).ename);
      end loop;
       exit when myemp_cur%notfound;
       end loop;
      end;
  
 


 

 

文章来源: bugstack.blog.csdn.net,作者:小傅哥,版权归原作者所有,如需转载,请联系作者。

原文链接:bugstack.blog.csdn.net/article/details/7900666

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。