首页 > 代码库 > oracle数据库中的cursor

oracle数据库中的cursor

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

1、cursor游标使用

[sql] view plain copy print ?
  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;
/*简单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] view plain copy print ?
  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. 欧阳锋
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游标使用

[sql] view plain copy print ?
  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;
/*
 *游标名: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] view plain copy print ?
  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. 欧阳锋 看小人书
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  /
 
杨过 保护小龙女
郭靖 修炼降龙十八掌
付政委 看小人书
刘自飞 编程写代码
江风 编程写代码
任我行 修炼神功
任盈盈 游山玩水
令狐冲 行侠仗义
韦一笑 吸拾人雪
张无忌 修行
朵儿 洗浴
谢逊 毕生研究屠龙刀
小龙女 修炼玉女心经
欧阳锋 看小人书


补充一种循环条件

[sql] view plain copy print ?
  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;
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

[sql] view plain copy print ?
  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;
/*普通方式*/
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

[sql] view plain copy print ?
  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;

oracle数据库中的cursor