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

 
相关文章
|
2月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
17天前
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧
|
16天前
|
SQL Oracle 关系型数据库
Oracle游标的使用和优化技巧
Oracle游标的使用和优化技巧
|
13天前
|
Oracle 关系型数据库
oracle收集统计信息,游标失效时间
Dbms_stats Invalidates Cursors in Auto_invalidate mode
20 0
|
13天前
|
Oracle 关系型数据库
oracle收集统计信息,游标失效时间
Dbms_stats Invalidates Cursors in Auto_invalidate mode
8 0
|
15天前
|
SQL 存储 Oracle
Oracle数据库中游标的工作原理与优化方法
Oracle数据库中游标的工作原理与优化方法
|
24天前
|
SQL Oracle 关系型数据库
Oracle游标深入探讨
Oracle游标深入探讨
|
2月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
2月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标自定义异常:数据探险家的“专属警示灯”
【4月更文挑战第19天】Oracle PL/SQL中的游标自定义异常是处理数据异常的有效工具,犹如数据探险家的警示灯。通过声明异常名(如`LOW_SALARY_EXCEPTION`)并在满足特定条件(如薪资低于阈值)时使用`RAISE`抛出异常,能灵活应对复杂业务规则。示例代码展示了如何在游标操作中定义和捕获自定义异常,提升代码可读性和维护性,确保在面对数据挑战时能及时响应。掌握自定义异常,让数据管理更从容。
|
2月前
|
SQL Oracle 安全
Oracle的PL/SQL游标异常处理:从“惊涛骇浪”到“风平浪静”
【4月更文挑战第19天】Oracle PL/SQL游标异常处理确保了在数据操作中遇到的问题得以优雅解决,如`NO_DATA_FOUND`或`TOO_MANY_ROWS`等异常。通过使用`EXCEPTION`块捕获并处理这些异常,开发者可以防止程序因游标问题而崩溃。例如,当查询无结果时,可以显示定制的错误信息而不是让程序终止。掌握游标异常处理是成为娴熟的Oracle数据管理员的关键,能保证在复杂的数据环境中稳健运行。

推荐镜像

更多