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游标使用


  
  1. /*简单cursor游标
  2. *students表里面有name字段,你可以换做其他表测试
  3. */
  4. --定义
  5. declare
  6. --定义游标并且赋值(is 不能和cursor分开使用)
  7. cursor stus_cur is select * from students;
  8. --定义rowtype
  9. cur_stu students%rowtype;
  10. /*开始执行*/
  11. begin
  12. --开启游标
  13. open stus_cur;
  14. --loop循环
  15. loop
  16. --循环条件
  17. exit when stus_cur%notfound;
  18. --游标值赋值到rowtype
  19. fetch stus_cur into cur_stu;
  20. --输出
  21. dbms_output.put_line(cur_stu.name);
  22. --结束循环
  23. end loop;
  24. --关闭游标
  25. close stus_cur;
  26. /*结束执行*/
  27. end;

执行结果


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

2、sys_refcursor游标使用


  
  1. /*
  2. *游标名:sys_refcursor
  3. *特别注意赋值方式:for
  4. *与上重复内容不在叙述
  5. */
  6. declare
  7. stu_cur sys_refcursor;
  8. stuone students%rowtype;
  9. begin
  10. --这句赋值方式for
  11. open stu_cur for select * from students;
  12. --fetch赋值给rowtype
  13. fetch stu_cur into stuone;
  14. loop
  15. dbms_output.put_line(stuone.name||' '||stuone.hobby);
  16. fetch stu_cur into stuone;
  17. exit when stu_cur%notfound;
  18. end loop;
  19. end;


执行结果


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


补充一种循环条件


  
  1. declare
  2. stu_cur sys_refcursor;
  3. stuone students%rowtype;
  4. begin
  5. open stu_cur for select * from students;
  6. fetch stu_cur into stuone;
  7. --特别注意循环条件的改变
  8. --这个条件是发现了在循环
  9. --与上一个notfound不同的
  10. while stu_cur%found loop
  11. dbms_output.put_line(stuone.name||' '||stuone.hobby);
  12. fetch stu_cur into stuone;
  13. end loop;
  14. end;

 

--普通的fetch into


  
  1. /*普通方式*/
  2. declare
  3. cursor myemp_cur is select * from myemp;
  4. v_myemp myemp%rowtype;
  5. begin
  6. open myemp_cur;
  7. fetch myemp_cur into v_myemp;
  8. while myemp_cur%found loop
  9. dbms_output.put_line(v_myemp.ename);
  10. fetch myemp_cur into v_myemp;
  11. end loop;
  12. end;


 --高效的bulk collect


  
  1. /*高效bulk collect for*/
  2. declare
  3. cursor myemp_cur
  4. is select * from myemp;
  5. type myemp_tab is table of myemp%rowtype;
  6. myemp_rd myemp_tab;
  7. begin
  8. open myemp_cur;
  9. loop
  10. fetch myemp_cur bulk collect into myemp_rd limit 20;
  11. for i in 1..myemp_rd.count loop
  12. dbms_output.put_line('姓名:'||myemp_rd(i).ename);
  13. end loop;
  14. exit when myemp_cur%notfound;
  15. end loop;
  16. end;


 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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