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

[经验分享] Oracle中游标示例

[复制链接]

尚未签到

发表于 2016-7-15 12:26:50 | 显示全部楼层 |阅读模式
  ----隐式游标
declare
begin
     update emp set sal=sal+10 where empNO=73619;
     if SQL%found then
        dbms_output.put_line('表被更新');
     end if;
     if SQL%isopen then
         dbms_output.put_line('test');
     else
         dbms_output.put_line('隐式游标始终为false');
     end if;
     dbms_output.put_line(SQL%Rowcount);
 end;
  ----SQL%notfound    no_data_found  异常
 declare
   myrow emp%rowtype;
   empDept emp.deptno%type;
 begin
   empDept := '&部门编号';
   select * into myrow from emp where emp.deptno=empDept;
 exception
    when no_data_found then
        dbms_output.put_line('没有找到数据');
    when too_many_rows then
        dbms_output.put_line('返回行过多');
    when others then
        dbms_output.put_line('未知错误');
 end;
 
 
----显式游标
  declare
   myrow emp%rowtype;
   empDept emp.deptno%type;
   cursor mycur is select * from emp where deptno=20;
 begin
       open mycur;
       loop
          fetch mycur into myrow;
          exit when mycur%notfound;
          dbms_output.put_line('员工姓名'||myrow.eName||'员工薪水'|| to_char(myrow.sal+nvl(myrow.comm,0)));
       end loop;
       close mycur;
 exception
    when no_data_found then
        dbms_output.put_line('没有找到数据');
    when too_many_rows then
        dbms_output.put_line('返回行过多');
    when others then
        dbms_output.put_line('未知错误');
 end;
  ----带参数显式游标
  declare
   myrow emp%rowtype;
   empDept emp.deptno%type;
   cursor mycur(deptId emp.deptno%type) is select * from emp where deptno=deptId;
 begin
      empDept := '&部门编号';
      dbms_output.put_line('部门编号'||empDept );
       open mycur(empDept);
       loop
          fetch mycur into myrow;
          exit when mycur%notfound;
          dbms_output.put_line('员工姓名'||myrow.eName||'  员工薪水'|| to_char(myrow.sal+nvl(myrow.comm,0)));
       end loop;
       close mycur;
 exception
    when no_data_found then
        dbms_output.put_line('没有找到数据');
    when too_many_rows then
        dbms_output.put_line('返回行过多');
    when others then
        dbms_output.put_line('未知错误');
 end;
  ----通过显示游标更改数据
  declare
   myrow emp%rowtype;
   empDept emp.deptno%type;
   cursor mycur is select * from emp where deptno=20 for update;
  begin
       open mycur;
       loop
          fetch mycur into myrow;
          exit when mycur%notfound;
          delete from emp where current of mycur;
       end loop;
       close mycur;
 exception
    when no_data_found then
        dbms_output.put_line('没有找到数据');
    when too_many_rows then
        dbms_output.put_line('返回行过多');
    when others then
        dbms_output.put_line('未知错误');
 end;
 
  ----循环游标  自动打开,自动提取, 自动关闭
 declare
   cursor mycur is select emp.empno,emp.ename from emp ;
 begin
    for abc in mycur
    loop
       dbms_output.put_line(abc.empno||'   '||abc.ename);
    end loop;
 end;
 
----参数 循环游标
  declare
   deptID emp.deptno%type;
   cursor mycur(mypara emp.deptno%type) is select emp.empno,emp.ename,emp.deptno from emp where emp.deptno=mypara;
 begin
    deptID := '&部门ID';
    for abc in mycur(deptID)
    loop
       dbms_output.put_line(abc.deptno||'  '||abc.empno||'   '||abc.ename);
    end loop;
 end;
 
 
----ref cursor  强类型 (return 类型)
----弱类型  无返回类型
 declare
     type myCur_type is ref cursor;
     mycur  myCur_type;
     EmpInfo emp%rowtype;
     deptInfo dept%rowtype;
     choice varchar2(100);
     deptId emp.deptno%type;
 begin
   choice :=substr('&输入要查询的简写字母"员工:e,部门:d"',1,1);
   deptID :='&部门部号';
   dbms_output.put_line(choice);
   if (choice ='e') then
      open mycur for 'select * from emp where deptno=:1' using deptId;
   elsif (choice ='d') then
      open mycur for select * from dept;
   end if;
  
 
   case choice
      when 'e' then
         fetch mycur into EmpInfo;
         dbms_output.put_line(EmpInfo.deptNO);
          loop
             exit when mycur%notfound;
             dbms_output.put_line(EmpInfo.empno||'  '|| EmpInfo.eName);
             fetch mycur into EmpInfo;
          end loop;
      when 'd' then
          loop
              fetch mycur into deptInfo;
              exit when mycur%notfound;
             dbms_output.put_line(deptInfo.deptno||'  '||deptInfo.dname);        
          end loop;
   end case;
   close mycur;  
 end;
 
 
 

运维网声明 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.yunweiku.com/thread-244565-1-1.html 上篇帖子: oracle中的合并查询 下篇帖子: Oracle的翻页Sql语句
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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