ORACLE游标

简介:

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

 
相关文章
|
7月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
3月前
|
存储 Oracle 关系型数据库
ORACLE 动态游标的使用
ORACLE 动态游标的使用
|
6月前
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧
|
5月前
|
SQL Oracle 关系型数据库
Oracle游标的定义与使用
Oracle游标的定义与使用
|
5月前
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧
|
6月前
|
SQL Oracle 关系型数据库
Oracle游标的定义与使用
Oracle游标的定义与使用
|
6月前
|
SQL Oracle 关系型数据库
Oracle游标的定义与使用技巧
Oracle游标的定义与使用技巧
|
5月前
|
Oracle 关系型数据库
oracle收集统计信息,游标失效时间
Dbms_stats Invalidates Cursors in Auto_invalidate mode
48 0
|
5月前
|
Oracle 关系型数据库
oracle收集统计信息,游标失效时间
Dbms_stats Invalidates Cursors in Auto_invalidate mode
39 0
|
5月前
|
SQL 存储 Oracle
Oracle数据库中游标的工作原理与优化方法
Oracle数据库中游标的工作原理与优化方法

相关实验场景

更多

推荐镜像

更多