博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

从概念到示例—Oracle显式游标

Posted on 2011-09-05 13:18  sunjie  阅读(183)  评论(0编辑  收藏  举报

个人总结:
   游标就是一个指向在客户端通过查询语句返回结果集中的指针,它存储在服务器端、
并维护着它内部所存储的数据,它主要利用了服务器端的高性能,解决了复杂运算在网
络间通信差的问题,游标不可乱用,否则会对服务器端的性能造成一定的影响。

一、显式游标
  1.由用户显式声明  cursor
  2.游标将指向活动集中的当前行

二、控制显式游标分为三个步骤
  1.Open
  2.Fetch  提取
  3.Close
 -- 注意 游标需要先声明,然后才能使用哦.

示例1:使用游标简单的提取一行记录
declare
   /*以下声明了一个显式游标,指向查询到得结果集*/
   cursor  empCur  is  select * from emp;
   emprow emp%rowtype;  --用于存储emp表的一行记录
begin
   open empCur;   --打开游标
   fetch empCur into emprow;  --从游标中提取一行记录
   DBMS_output.put_line('employee no:'||emprow.empno||'employee name'||emprow.ename);
   close empCur; --关闭游标
end;

示例2:使用游标提取表中的所有记录,用loop循环提取
declare
   cursor  empCur  is  select * from emp;--声明游标
   emprow emp%rowtype;  --用于存储emp表的一行记录
begin
   open empCur;   
   loop
     fetch empCur into emprow;  
     exit when empCur%notfound; --退出条件
     DBMS_output.put_line('employee no:'||emprow.empno||'employee name:'||emprow.ename);
     DBMS_output.put_line('提取了'||empCur%rowcount); 
   end loop;
   close empCur; --关闭游标
end;

示例3:使用游标提取表中的所有记录,用while循环提取
declare
   cursor  empCur  is  select * from emp;--声明游标
   emprow emp%rowtype;  --存储emp表的一行记录
begin
   open empCur;  
   fetch empCur into emprow;   --先初始化 
   While empCur%Found Loop     --进入循环的条件
     DBMS_output.put_line('employee no:'||emprow.empno||' '||'employee name:'||emprow.ename);
     DBMS_output.put_line('提取了'||empCur%rowcount); 
   fetch empCur into emprow;   --增量条件  否则进入死循环
   end loop;
   close empCur; --关闭游标
end;
示例4:使用游标提取表中的所有记录,用for循环提取
 特点是: 
    自动声明行级变量
    自动打开  
    自动提取 
    自动关闭的
    简化代码的编写
  缺点是:
     一次性会把结果集都输出。造成不必要的资源浪费。
declare
   cursor  empCur  is  select * from emp;--声明游标
begin
    for emprow in empCur loop
     DBMS_output.put_line('employee no:'||emprow.empno||' '||'employee name:'||emprow.ename);
     DBMS_output.put_line('提取了'||empCur%rowcount); 
    end loop;
end;

示例5:改造游标,使用绑定变量,使游标具有动态性 
使用绑定变量在编译时对代码进行赋值
declare
   cursor  empCur  is  select * from emp where  sal>&InputSalary;
   iCount int;
begin
    iCount:=&iCount;
    DBMS_output.put_line('iCount='||iCount);
    for emprow in empCur loop
     DBMS_output.put_line('employee no:'||emprow.empno||' '||'employee name:'||emprow.ename);
     DBMS_output.put_line('提取了'||empCur%rowcount); 
    end loop;
end;

示例6:带参数的游标使用方法
 declare
     cursor empCur(param number default 10) is select * from emp where deptno=param;
 begin
     for emprow in empCur(10) loop
        DBMS_output.put_line('employee no:'||emprow.empno||' '||'employee name:'||emprow.ename);
     end loop;
 end;