设为首页 收藏本站
查看: 1717|回复: 0

[经验分享] ORACLE PL/SQL 显式游标

[复制链接]

尚未签到

发表于 2018-9-9 12:39:52 | 显示全部楼层 |阅读模式
  显式游标
  显式游标使用流程:
  1.声明 declare
  2.打开 open
  3.获取 fetch
  4.关闭 close
  练习 1: 基本loop循环+显示游标的使用
  DECLARE
  v_empno emp.empno%TYPE;
  v_ename emp.ename%TYPE;
  CURSOR emp_cursor IS SELECT empno, ename FROM emp; --声明
  BEGIN
  OPEN emp_cursor; --打开
  LOOP
  FETCH emp_cursor INTO v_empno, v_ename; --获取
  exit when emp_cursor%rowcount>20 or emp_cursor%notfound;
  DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno)||' '|| v_ename);
  END LOOP;
  CLOSE emp_cursor; --关闭
  END ;
  /
  练习 2: for循环+显示游标的使用
  DECLARE
  v_empno emp.empno%TYPE;
  v_ename emp.ename%TYPE;
  CURSOR emp_cursor IS SELECT empno, ename FROM emp;
  BEGIN
  OPEN emp_cursor;
  FOR i IN 1..10 LOOP --数字for循环
  FETCH emp_cursor INTO v_empno, v_ename;
  DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno)||' '|| v_ename);
  END LOOP;
  CLOSE emp_cursor;
  END ;
  /
  游标for循环:
  declare
  cursor emp_cursor is select rownum,empno,ename from emp; --声明
  begin
  for emp_record in emp_cursor loop --隐式打开隐式获取
  exit when emp_cursor%rowcount>5;
  dbms_output.put_line(emp_record.rownum||' '||
  emp_record.empno||' '||
  emp_record.ename);
  end loop; --隐式关闭
  end;
  /
  省略游标定义:
  begin
  for r in (select ename from emp) loop
  dbms_output.put_line(r.ename);
  end loop;
  end;
  /
  高级显式游标(带参数的游标):
  练习 1:通过传入不同的参数使打开游标时取到不同的结果集
  declare
  cursor c1 (p_deptno number,p_job varchar2)
  is
  select empno,ename
  from emp
  where deptno=p_deptno
  and job=p_job;
  begin
  Dbms_output.put_line('first fetch cursor!');
  for r_c1 in c1(10,'MANAGER') loop --open cursor时传入不同的实际参数得到不同的游标上下文!
  Dbms_output.put_line(r_c1.empno||' '||r_c1.ename);
  end loop;
  Dbms_output.put_line('second fetch cursor!');
  for r_c1 in c1(20,'MANAGER') loop
  Dbms_output.put_line(r_c1.empno||' '||r_c1.ename);
  end loop;
  Dbms_output.put_line('third fetch cursor!');
  for r_c1 in c1(30,'MANAGER') loop
  Dbms_output.put_line(r_c1.empno||' '||r_c1.ename);
  end loop;
  end;
  /
  练习:获取每个部门前两个雇员的信息
  获取10部门前两个人的信息
  declare
  cursor c1 is select * from scott.emp
  where deptno=10;
  begin
  for r1 in c1 loop
  exit when c1%rowcount=3 or c1%notfound;
  dbms_output.put_line(r1.ename||' '||r1.deptno);
  end loop;
  end;
  /
  使用替代变量取指定部门的前两个人的信息
  declare
  cursor c1 is select * from scott.emp
  where deptno=&p_deptno;
  begin
  for r1 in c1 loop
  exit when c1%rowcount=3 or c1%notfound;
  dbms_output.put_line(r1.ename||' '||r1.deptno);
  end loop;
  end;
  /
  使用高级游标代替替代变量
  declare
  cursor c1(p_deptno number) is select * from scott.emp
  where deptno=p_deptno;
  begin
  for r1 in c1(10) loop
  exit when c1%rowcount=3 or c1%notfound;
  dbms_output.put_line(r1.ename||' '||r1.deptno);
  end loop;
  for r1 in c1(20) loop
  exit when c1%rowcount=3 or c1%notfound;
  dbms_output.put_line(r1.ename||' '||r1.deptno);
  end loop;
  for r1 in c1(30) loop
  exit when c1%rowcount=3 or c1%notfound;
  dbms_output.put_line(r1.ename||' '||r1.deptno);
  end loop;
  end;
  /
  使用循环嵌套简化上面的代码
  declare
  cursor c2 is select distinct deptno from scott.emp;
  cursor c1(p_deptno number) is
  select * from scott.emp
  where deptno=p_deptno;
  begin
  for r2 in c2 loop
  for r1 in c1(r2.deptno) loop
  exit when c1%rowcount=3 or c1%notfound;
  dbms_output.put_line(r1.ename||' '||r1.deptno);
  end loop;
  end loop;
  end;
  /
  练习 2:将每个部门工资小于1000的职员工资涨10%
  declare
  cursor c1 is select deptno from scott.dept;
  cursor c2 (p_deptno number,p_job varchar2)
  is
  select empno,ename
  from emp
  where deptno=p_deptno
  and job=p_job
  for update of sal;
  begin
  for r_c1 in c1 loop
  dbms_output.put_line('第'||c1%rowcount||'次获取游标c1' || '修改'||r_c1.deptno||'部门职员的工资');
  for r_c2 in c2(r_c1.deptno,'CLERK') loop
  if r_c2.sal

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-569030-1-1.html 上篇帖子: ORACLE PL/SQL 结构控制 下篇帖子: ORACLE PL/SQL 异常处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表