论坛首页 综合技术论坛

sql 游标实例

浏览 7359 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-12  
游标管理
  
  :隐式游标  -:自身存在的游标,处理返回单行语句,不用创建默认名称是小写sql
  游标    :显示游标  -:返回多行查询
  :REF游标   -:可以指向多个结果集的游标

   隐式游标 :%found    找到
    :%notfound 没有找到
   单行异常 :too_mang_rows
   多行异常 :no_data_found
-----------------------------
1、隐式游标
实例1、用sql%found 相当于sql.found 
set serveroutput on;
declare
begin
    update userinfo set username='aaa' where userid=1;
    if sql%found then
      dbms_output.put_line('ok');
dbms_output.put_line(sql%rowcount);//返回更新的行数
    end if
    if sql%notfound then
     dbms_output.put_line('no');
    end if;
    exception
    when when no_data_found then
dbms_output.put_line('no data found');
end;

实例2、使用sql%notfound

set serveroutput on;
declare
  var_name userinfo.username%type;
  begin
      select username into var_name from userinfo  where userid=1;
          dbms_output.put_line('username='||var_name);
      exception
      when no_data_found then //单行异常   too_mang_rows:多行异常
          dbms_output.put_line('no data found');
  end;

------------------------------------------------------
2、显示游标:必须要有结果集 userInfo表里加个字段 salary

set serveroutput on;
declare
  var_userid number(3);
  var_salary number(3);
  cursor mysor is select userid,salary from userinfo;//声明一个游标 它的类型是这个表里的列的类型
begin
     open mysor; 打开游标
     loop
        fetch mysor into var_userid,var_sqlary;//相当于foreach
        exit when mysor%notfound; //判断如果没有找到
        if var_userid=1 then
              update userinfo set salary = salary+salary*0.5 where userid=var_userid;
end if;
        if var_userid=2 then
              update userinfo set salary = salary+salary*0.6 where userid=var_userid;
        end if;
        if var_userid=3 then
              update userinfo set salary = salary+salary*0.7 where userid=var_userid;
        end if;
        commit;
     end loop;
     close mysor;//关闭游标
end;
--------------------------
给游标传参数

set serveroutput on;
declare
  var_name varchar(2);
  cursor mysor(myid number) is select username from userinfo where userid=myid;
  begin
    loop
       open mysor(6);//给游标传参数
       fatch mysor into var_name;
       exit when mysor%notfound;
       dbms_output.put.line(var_name);
    end loop;
    close mysor;
  end;
-------------------------
for 循环游标
set serveroutput on;
declare
  cursor mysor is select * from userinfo;--//游标的类型就是这张表的所有列的类型
  begin
    --open mysor; //使用for循环游标不用打开关闭的 它自动开关
    for a in mysor  --//for循环的变量不用声明 可直接使用 a
    loop
        dbms_output.put_line(a.username);
    end loop;
   -- close mysor;
  end;
------------------------
3、ref游标 用type声明变量
set serveroutput on;
declare
   type mysor is ref cursor; --//声明一个可以读多个结果集的游标
   var_sor,mysor;  --//var_sor是个游标类型
   var_user userInfo%rowtype;--//var_user是这个表的行类型
   var_person personInfo%rowtype;
   begin
      open var_sor for select * from userInfo;--//打开游标检索的结果集
      loop
          fetch var_sor into var_user;
          exit when var_sor%notfound;
          dbms_output.put_line(var_user.username);
      end loop;
      close var_sor;
     
      open var_sor for select * from personInfo;--//检索第二个结果集的游标
      loop
        fetch var_sor into var_person;
        exit when var_sor%notfound;
        dbms_output.put_line(var_person.pname);
      end loop;
      close var_sor;
      end  loop;
  end;
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics