码迷,mamicode.com
首页 > 其他好文 > 详细

cursor

时间:2015-01-05 23:09:43      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

cursor

 

一、分类:

静态游标  

  显式游标(需要明确定义)  

   隐式游标(所有dml语句都为隐式游标,for循环也是隐式游标)

ref游标 (尽量不用ref游标,ref游标可在程序间传递数据集)  

  强类型ref游标(定义中有返回值)  

  弱类型ref游标(定义中无返回值)

 

二、游标的几个状态值:(%前接游标类型的变量)

%found

%notfound

%isopen

%rowcount:当前游标遍历到的行值

 

三、粗暴的定义:用于遍历查询结果集,从而依次对结果集中的行做出相关操作;

 

四、各种游标简单实例

 

--显式游标----------------------
--loop循环
declare 
  cursor test_cursor is select * from dept;
  test_ dept%rowtype;--也可写为test_ test_cursor%rowtype;【此时test_cursor被看做一个结果集?】
begin
  if test_cursor%isopen
     then close test_cursor;
  end if;
  open test_cursor;
  loop
       fetch test_cursor into test_;
       exit when test_cursor%notfound;
       dbms_output.put_line(test_.deptno);
  end loop;
  dbms_output.put_line(test_cursor%rowcount);
  close test_cursor;
end;

--隐式游标----------------------
--for循环
declare 
  cursor test_cursor is select * from dept;
  --test_ test_cursor%rowtype;--这一段可忽略,游标变量在for循环中可直接使用,可不需要定义
begin
  for test_ in test_cursor
    loop
        dbms_output.put_line(test_.loc);
    end loop;
end;
/*
注:
    for游标可不定义游标类型变量
    for后接的就是游标类型变量
*/       
   
--DML(update,insert,delete)
begin
  update test_trans01 set b=111 where a=a;
  if sql%rowcount<>0 then
    dbms_output.put_line(sql%rowcount||行被更新!);
  end if;
end;

--强类型ref游标----------------------
declare
  type test_cursor is ref cursor return test_trans01%rowtype;
  test_ test_cursor;
  test__ test_%rowtype;
begin
  open test_ for select * from test_trans01;
  loop
       fetch test_ into test__;
       exit when test_%notfound;
       dbms_output.put_line(test__.a);
  end loop;
  close test_;
end;

--弱类型ref游标----------------------
declare
  type test_cursor is ref cursor;
  test_ test_cursor;
  --test__ test_%rowtype;【这样应用会报错】
  test__ dept%rowtype;
begin
  open test_ for select * from dept;
  loop
       fetch test_ into test__;
       exit when test_%notfound;
       dbms_output.put_line(test__.dname);
  end loop;
  close test_;
end;

--应用实例----------------------
--for update/delete【用于修改或删除表中数据】
declare
      cursor test_cursor is select * from test_trans01 for update;--
begin
  for test_ in test_cursor
    loop
      dbms_output.put_line(test_.a);
      if test_.a=a then
        update test_trans01 set b=1111 where current of test_cursor;
        dbms_output.put_line(test_.a||被更新!);
      else null;
      end if;
    end loop;
end;

--带参数的显示游标
--暂时未发现可用之处,或许可用在复杂的语句块中,接收条件判定生成的参数,但讲参数直接写在where后是一样的效果。。?
declare
    cursor test_cursor(dd number :=2) is select * from test_trans01 where b>dd;--参数变量不能限定范围
    test_ test_cursor%rowtype;
begin
    open test_cursor;
    loop
         fetch test_cursor into test_;
         exit when test_cursor%notfound;
         dbms_output.put_line(test_.b);
    end loop;
    close test_cursor;
end; 

 

 

 

cursor

标签:

原文地址:http://www.cnblogs.com/heibaitan/p/4204649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!