ORACLE游标

本文深入讲解Oracle数据库中的游标概念,包括隐式游标、显示游标和动态游标(Ref Cursor)。通过具体实例展示了不同类型的游标的使用方法及其应用场景。

ORACLE的游标不是一个指针,而是一块内存区域,SQL语句在这块内存中执行。OPEN一个游标也就是申请一块内存。

常规上我们把游标分为三类:隐式(implicit cursor)的,显示(explicit cursor)的,与动态游标(Ref cursor)
游标经历:声明(declare), 打开(open从游标中获取记录(Fetch into),关闭(close)。简单的过程,完美的人生。
一、隐式游标,于世无争。
任何给定的PL/SQL块都会OPEN一个隐式游标,除非已经为他定义了一个显示游标。
ORACLE自为执行declare ,open, Fetch, close的过程。
   隐式游标用于Insert,Delete,Update select into .(注意不是SELECTSELECT只能用显示游标,除非用于for loop语句)
Ex:
1.    declare 

begin 

             update anran set name='guojj'

             dbms_output.put_line('update '|| sql%rowcount ||' records'); 

end
2. (只能取得一行记录)
declare 

l_empName anran.name%type; 

begin 

select name         

    into l_empName 

from anran; 

dbms_output.put_line(l_empName); 

end;
3.(for loop) 
         declare    

begin    

for me in ( select id,name from anran)    

        loop    

                dbms_output.put_line(me.id || ' : ' || me.name);    

                end loop;    

end;    
二.显式游标,只为SLELECT生。
声明方式:CURSOR 游标名 ( 参数 ) [返回值类型]  IS   Select 语句
Declareopen, Fetch, close,四个过程缺一不可,当然你可以不FETCH,那就不知道你要干什么了
Ex:
Declare 

-- declare 

Cursor students is 

Select * from anran where rownum<6 order by 1; 

stu anran%rowtype; 

Begin 

--open 

Open students; 

--fetch 

Fetch students into stu; 

Loop 

    If students%found then 

     Dbms_output.put_line('it is ' || students%rowcount); 

     Fetch students into stu; 

    Elsif students%notfound then 

     Exit;    

    End if

End loop; 

If students%isopen then 

--close 

    Close students; 

End if

End

三.REF CURSOR游标,强中自有强中手。
动态游标,在运行的时候才能确定游标使用的查询。
定义方式:TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]
              cursor_name  ref_cursor_name.
类比C++语言:
定义一个int类量有两种方式: 1. int a
                         2.int *p; p=new int;//运行时分配内存
 ex:  
Declare 

type ref_cursor is    ref cursor

students ref_cursor; 

-- declare 

stu anran%rowtype; 

Begin 

--open 

Open students for    Select * from anran where rownum<6 order by 1; 

--fetch 

Fetch students into stu; 

Loop 

    If students%found then 

     Dbms_output.put_line('it is ' || students%rowcount); 

     Fetch students into stu; 

    Elsif students%notfound then 

     Exit;    

    End if

End loop; 

If students%isopen then 

--close 

    Close students; 

End if

End

 
 谢谢。

本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/317112

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值