经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle学习笔记(十八) PL/SQL 游标 - Stars-one
来源:cnblogs  作者:Stars-one  时间:2019/5/30 8:54:21  对本文有异议

游标

说明

查询结果的光标,相当于java中的一个迭代器,方便遍历操作

可使用的属性

  • %FOUND
    SQL语句查询或影响了一行或多行时为 TRUE。如:mycursor%FOUND
  • %NOTFOUND
    SQL语句没有影响任何行时为 TRUE。如:mycursor%NOTFOUND
  • %ROWCOUNT
    SQL语句查询或影响的行数。如:mycursor%ROWCOUNT
  • %ISOPEN
    检查游标是否打开,隐式游标始终为FALSE。如:mycursor%ISOPEN

隐式游标

自动声明,自动打开,自动关闭,名称为SQL
只能处理单行数据

  1. declare
  2. emp_t employee%rowtype;
  3. begin
  4. select * into emp_t from employee where empno = 7859;
  5. if SQL%found then
  6. dbms_output.putline()
  7. end if;
  8. end;
  9. /

显式游标

遍历输出

  1. cursor 游标名称[(参数列表)] IS select_statement
  2. --使用游标遍历查询结果并输出
  3. declare
  4. --给查询结果建立一个游标
  5. cursor cv_emp is select * from employee;
  6. v_emp employee%rowtype;
  7. begin
  8. --使用for循环,游标会自动打开,移动和关闭
  9. for v_emp in cv_emp loop
  10. --这里只输出了员工编号和员工姓名
  11. dbms_output.put_line(v_emp.empno||','||v_emp.ename);
  12. end loop;
  13. end;
  14. /

游标使用

  1. 声明游标: cursor 游标名称[(参数列表)] IS select_statement;
  2. 打开游标: open 游标名称[(参数列表)];
  3. 从游标中提取数据(移动游标)到变量: FETCH 游标名称 INTO 变量列表....;
  4. 关闭游标: close 游标名称;

游标开始的时候是处于第一行之前,需要移动

  1. --loop循环使用显示游标
  2. --输出全部员工的信息
  3. declare
  4. cursor cv_emp
  5. is select empno,ename,job,sal,hiredate from employee;
  6. --声明一个可存储游标行的变量
  7. rec_emp cv_emp%rowtype;
  8. i number := 1;
  9. begin
  10. open cv_emp;
  11. loop
  12. --会使游标向下移动,并将游标所指向的数提取到指定的变量中
  13. fetch cv_emp into rec_emp;
  14. exit when cv_emp%notfound;--找不到数据就退出循环
  15. dbms_output.put_line(i||'. '||rec_emp.empno||', '
  16. ||rec_emp.ename||', '
  17. ||rec_emp.job||','
  18. ||rec_emp.sal||','
  19. ||rec_emp.hiredate);
  20. i := i+1;
  21. end loop;
  22. close cv_emp;--关闭游标
  23. end;
  24. /
  25. --使用while循环
  26. declare
  27. --1. 声明游标
  28. cursor cv_emp
  29. is select empno,ename,job,sal,hiredate from employee;
  30. rec_emp cv_emp%rowtype;
  31. i number := 1;
  32. begin
  33. open cv_emp;--2.打开游标
  34. fetch cv_emp into rec_emp;--进入循环前就得移动游标
  35. while cv_emp%found loop
  36. dbms_output.put_line(i||'. '||rec_emp.empno||', '
  37. ||rec_emp.ename||', '
  38. ||rec_emp.job||','
  39. ||rec_emp.sal||','
  40. ||rec_emp.hiredate);
  41. fetch cv_emp into rec_emp;
  42. i := i+1;
  43. end loop;
  44. close cv_emp;--关闭游标
  45. end;
  46. /

带参数游标使用

  1. --对所有的"销售员"(SALESMAN)增加佣金500.
  2. declare
  3. cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job;
  4. v_emp employee%rowtype;
  5. begin
  6. for v_emp in cv_emp('SALESMAN') loop
  7. --使用主键约束,更新特定行
  8. update employee set sal = sal +500 where empno = v_emp.empno;
  9. end loop;
  10. commit;
  11. end;
  12. /

游标更新数据

一般更新操作,需要一个条件,来指定需要更新的该条数据,一般使用主键来指定。
如果不想使用主键来指定,还可以使用游标当作指定条件,这就是游标更新行

  1. --对所有的"销售员"(SALESMAN)增加佣金500.
  2. --普通方式更新数据
  3. declare
  4. cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job;
  5. v_emp employee%rowtype;
  6. begin
  7. for v_emp in cv_emp('SALESMAN') loop
  8. --使用主键约束,更新特定行
  9. update employee set sal = sal +500 where empno = v_emp.empno;
  10. end loop;
  11. commit;
  12. end;
  13. /
  14. --使用游标更新数据
  15. declare
  16. cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job for update;
  17. v_emp employee%rowtype;
  18. begin
  19. open cv_emp('SALESMAN');
  20. loop
  21. fetch cv_emp into v_emp;
  22. --使用游标定位特定行
  23. update employee set sal = sal +500 where current of cv_emp;
  24. end if;
  25. exit when ev_emp%notfound;
  26. end loop;
  27. commit;
  28. close cv_emp;
  29. end;
  30. /

REF游标

引用游标,动态游标,后期补充..

原文链接:http://www.cnblogs.com/kexing/p/10943878.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号