首页 > 代码库 > cursor

cursor

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