Oracle游标的用法

----------------------隐式游标 %isopen , %notfound , %found
定义游标
declare
begin
 ........
end;

定义:隐式游标则由则由系统自动定义,非显示定义游标的DML语句即被赋予隐式游标属性。其过程由oracle控制,完全自动化。隐式游标的名称是SQL,不能对SQL游标显式地执行
OPEN,FETCH,CLOSE语句。

属性:类似于显示游标,隐式游标同样具有四种属性,只不过隐式游标以SQL%开头,而显示游标以Cursor_name%开头。通过SQL%总是只能访问前一个DML操作或单行SELECT操作的游标属性,用于判断DML执行的状态和结果,进而控制程序的流程。       

        属性一:SQL%ISOPEN  
            游标是否打开。当执行select into ,insert update,delete时,Oracle会隐含地打开游标,且在该语句执行完毕或隐含地关闭
            游标,因为是隐式游标,故SQL%isopen----总是false

        属性二:SQL%FOUND
            判断SQL语句是否成功执行。当有作用行时则成功执行为true,否则为false。   

        属性三:SQL%NOTFOUND   
            判断SQL语句是否成功执行。当有作用行时否其值为false,否则其值为true。

        属性四:SQL%ROWCOUNT  
            在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为,如果没有
 
            成功,SQL%ROWCOUNT的值为,同时产生一个异常NO_DATA_FOUND。


declare
begin
     if sql%isopen then
        dbms_output.put_line('游标已打开');
     else
        dbms_output.put_line('游标未打开');--输入此条,因为是隐式的,所以总是未打开
     end if;
end;

declare
begin
     update emp set sal=1000;
     dbms_output.put_line('你已经处理了'||sql%rowcount||'条数据');
end;
-----------notfound的用法
declare
begin
     update emp set sal=1000;
     if sql%notfound then
        dbms_output.put_line('游标未找到');
     else
         dbms_output.put_line('游标已找到');--输出此条
     end if;
end;
-----------found的用法
declare
begin
     update emp set sal=1000;
     if sql%found then
        dbms_output.put_line('游标找到');--输出此条
     else
         dbms_output.put_line('游标未找到');
     end if;
end;

--------注:
当进行update,delete,insert操作的时候就要用到隐式游标
declare
begin
     update emp set sal=1000;--修改
     if sql%found then
        dbms_output.put_line('修改成功');
     end if;
end;

declare
begin
     update emp set sal=1000 where empno=7369;
     if sql%found then
        dbms_output.put_line('游标已打开');
     else
         dbms_output.put_line('游标未打开');
     end if;
end;

select* from emp;


------------------------------------普通游标(带参数和不带参数)

循环游标用loop....end loop


--1。显示所有员工信息(不带参数)
declare
       cursor mycur is select * from emp;
       myemp emp%rowtype;
begin
     open mycur;
          loop
              fetch mycur into myemp;
              exit when mycur%notfound;
              dbms_output.put_line('员工编号:'||myemp.empno||'   员工姓名:'||myemp.ename||'员工工资:'||myemp.sal);
          end loop;
     close mycur;
end;


--2。输入部门编号,显示该部门员工的详细信息(带参数)
declare
       cursor mycur(myno emp.deptno%type) is select * from emp where deptno=myno;
       myemp emp%rowtype;
       mydeptno emp.deptno%type;--所要接的参数      
begin
     mydeptno:=&请输入员工编号;
     open mycur(mydeptno);
          loop
              fetch mycur into myemp;
              exit when mycur%notfound;
                   dbms_output.put_line('员工编号:'||myemp.empno||'   员工姓名:'||myemp.ename||'员工工资:'||myemp.sal||'部门编号:'||myemp.deptno);
          end loop;
     close mycur;
end;

----------------------------------循环游标
--1。显示所有员工信息
declare
       cursor mycur is select * from emp;
begin
     for i in mycur
         loop
              dbms_output.put_line('员工编号:'||i.empno||'   员工姓名:'||i.ename||'员工工资:'||i.sal);
         end loop;
end;

 

--------------------------------------用游标批量更新数据
declare
       cursor mycur is select sal from emp for update;
       mysal emp.sal%type;
begin
     open mycur;
          loop
              fetch mycur into mysal;
              exit when mycur%notfound;
                   mysal:=mysal*2;
                   update emp set sal=mysal where current of mycur;
          end loop;
     close mycur;
end;

select * from emp;


-----------------------------------引用游标
declare
       mychar char(10);
       type mycur is ref cursor;
       mpp mycur;
       myemp emp%rowtype;
begin
     mychar:=&请输入一个字符;
     if mychar='a'then
        open mpp for select * from emp where deptno=10;
             loop
                 fetch mpp into myemp;
                 exit when mpp%notfound;
                      dbms_output.put_line('员工编号:'||myemp.empno||'员工姓名:'||myemp.ename||'部门编号:'||myemp.deptno);
             end loop;
     elsif mychar='b' then
         open mpp for select * from emp where deptno=20;
           loop
               fetch mpp into myemp;
               exit when mpp%notfound;
                    dbms_output.put_line('员工编号:'||myemp.empno||'员工姓名:'||myemp.ename||'部门编号:'||myemp.deptno);
           end loop;
     else
         open mpp for select * from emp where deptno=30;
                 loop
                     fetch mpp into myemp;
                     exit when mpp%notfound;
                          dbms_output.put_line('员工编号:'||myemp.empno||'员工姓名:'||myemp.ename||'部门编号:'||myemp.deptno);
                 end loop;
     end if;
end;


最后,欢迎访问风格清新简洁的轻博客网站[指尖一刻]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值