`
mikixiyou
  • 浏览: 1098699 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353058
社区版块
存档分类
最新评论

Oracle SQL的cursor理解

阅读更多

      在 PL/SQL 开发中,会涉及到很多 cursor 的处理操作,这个 cursor 通常被翻译成游标。游标又分成显式和隐式两类。使用 update delete  insert 操作,都是隐式游标;而使用 select 操作,可能是隐式游标也可能是显示游标。

隐式游标中大写的" SQL" 标识,如 SQL%ROWCOUNT 表示隐式游标有几行记录;显式游标由开发者自定义,也可以使用如 C1%ROWCOUNT 表示游标 C1 有几行记录。通常显式游标都是使用 OPEN 方式打开的。

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1723165 )

 

使用显式定义的游标使用 OPEN 方式打开,它的使用方法如下例所示:

 

set serveroutput on

declare

  cursor c1 is

    select rownum ,table_name from user_tables where rownum < 10 ;

  v_rownum number ;

  v_tablename varchar2 ( 256 );

begin

  open c1;

  dbms_output.put_line( ' 游标当前行数 1:' || c1% rowcount );

  loop

     fetch c1 into v_rownum,v_tablename;

    exit when c1% notfound ;

    dbms_output.put_line( ' 游标当前行 :' || c1% rowcount || ' table_name:' ||v_tablename);

  end loop ;

  dbms_output.put_line( ' 游标当前行数 2:' || c1% rowcount );

  close c1;

end ; 
 

 

SQLPUS 中执行,得到如下结果。

 

游标当前行数 1:0

游标当前行 :1 table_name:T_SS

游标当前行 :2 table_name:T_TARGET

游标当前行 :3 table_name:T_SS_NORMAL

游标当前行 :4 table_name:T_MYSTAT

游标当前行 :5 table_name:T_WXL_GETDATA_LOG

游标当前行 :6 table_name:ALL_OBJ

游标当前行 :7 table_name:DBA_OBJ

游标当前行 :8 table_name:T_RPT_XXX

游标当前行 :9 table_name:CMS_DOC_BODY

游标当前行数 2:9 
 

 

分析一下,游标 C1 是显式定义,可以看作是一个查询语句的变量。其实它是指向这个查询语句得到的内存区域的指针。

在打开游标时,就是定位指针在查询结果集内存区域的位置,开始还是空值。使用 fetch into 操作依次移动指针定义结果集每一行记录,直到 C1%NOTFOUND 属性为 true 而退出循环。 C1%NOTFOUND 表示游标 C1 已经到最后一行了,不能再向下移动,无法找到更多的记录了。游标最后关闭,所有的显式游标再打开后都要关闭。

另外再深入说明一下,这个结果集不是真正意义上的结果集内存缓存,它还是从各个相关数据块中查询出来的。每一次执行,就遍历一次各个数据块。所以你会在执行统计结果中看到稳定的内存读数字。所以,这个结果集也是一个抽象的逻辑概念。(注,这段是个人理解,未必准确。)

 

使用隐式游标多数发生在 update,delete ,insert 操作中,它操作的也是一个结果集。如我们经常需要知道 update 某个表的记录数的结果。使用隐式游标的 SQL%ROWCOUNT 功能可能非常快捷地知道它。

 

 

set serveroutput on

declare

begin

  update all_obj set created = sysdate where object_type = 'TABLE' ;

  dbms_output.put_line( ' 更新的记录数 :' || sql % rowcount );

  commit ;

  delete from   all_obj where object_type = 'CLUSTER' ;

  dbms_output.put_line( ' 删除的记录数 :' || sql % rowcount );

  commit ;

  insert into all_obj  select * from all_obj where object_type = 'TABLE' ;

  dbms_output.put_line( ' 插入的记录数 :' || sql % rowcount );

  commit ;

end ;

/

  
 

   执行结果如下:

 

更新的记录数 :11940

删除的记录数 :11

插入的记录数 :11940

 
PL/SQL procedure successfully completed 

 

 

使用 SQL 隐式游标可以得到要 update,delete,insert 这些操作过程中结果集的记录数。隐式游标不需要开发打开和关闭。这些操作也是在一个结果集上进行操作,使用游标遍历结果集中的每一行记录。这样,游标就可以为一个指针。

 

 

 

       看一下别人对游标的定义吧。

 

 

 

Oracle 官方文档 Oracle® Database Concepts 11g Release 2 中这么说的:

A cursor is a name or  handle to a specific private SQL area.

游标是一个指向私有 SQL 区域的名字或者句柄。因为游标和私有 SQL 区域紧密相关,这两个名词有时候互换使用。

在开发过程中看到的游标指向的结果集,其实是私有 SQL 区域中语句执行的结果集。游标仅仅是这个结果集生成的方法。

私有 SQL 区域在专用服务模式下位于 PGA 中。 PGA 的组成分别为 SQL work areas session memory private SQL area

A work area is a private allocation of PGA memory used for memory-intensive operations. For example, a sort operator uses the sort area to sort a set of rows. Similarly, a  hash join  operator uses a hash area to build a  hash table  from its left input, whereas a  bitmap merge  uses the bitmap merge area to merge data retrieves from scans of multiple bitmap indexes.

The UGA is session memory, which is memory allocated for session variables, such as logon information, and other information required by a database session. 

A private SQL area holds information about a parsed SQL statement and other session-specific information for processing. When a server process executes SQL or PL/SQL code, the process uses the private SQL area to store  bind variable  values, query execution state information, and query execution work areas.

 

私有 SQL 区域持有一个分析过的 SQL 语句和其他用于进程处理的会话指定的信息。当一个服务器进程执行一个 SQL PL/SQL 代码事,这个进程使用私有 SQL 区域去保存绑定变量值,查询状态信息,和查询工作区域。

私有 SQL 区域分成下列两个区域:

运行时区域( run-time area

This area contains query execution state information. For example, the run-time area tracks the number of rows retrieved so far in a  full table scan .

Oracle Database creates the run-time area as the first step of an execute request. For  DML  statements, the run-time area is freed when the SQL statement is closed.

 

分享到:
评论

相关推荐

    DBA对Oracle SQL编写规范的总结

    ### DBA对Oracle SQL编写规范的总结 #### 一、引言 在Oracle数据库开发过程中,遵循一套标准化的SQL编写规范对于提升代码质量、增强可读性和可维护性至关重要。本文档由一位经验丰富的数据库管理员(DBA)撰写,旨在...

    ORACLE SQL官方教程

    通过本教程,读者将不仅了解SQL的基本语法,还能深入理解Oracle SQL的高级特性,提升数据库管理与开发技能。对于数据库管理员、开发人员或任何需要处理Oracle数据库的人来说,这是一份宝贵的参考资料。

    oraclesql 学习资料

    ### Oracle SQL 学习资料详解 #### 一、Oracle SQL 概述 Oracle SQL 是 Oracle 数据库的标准查询语言,用于管理、检索和处理 Oracle 数据库中的数据。...通过实践上述示例和技巧,您可以更好地理解和应用 Oracle SQL。

    oracle-cursor.rar_cursor_oracle_oracle cursor

    Oracle游标是数据库管理系统中非常重要的一个概念,它在处理SQL查询时扮演着核心角色,尤其是在需要逐行处理结果集的场景下。Oracle游标允许我们动态地控制和操作查询的结果,使得我们可以按需处理每一行数据,而不...

    Oracle SQL查考手册chm

    Oracle SQL的深入学习还包括联接(JOIN)、子查询、游标(Cursor)、事务(Transaction)、索引优化、性能调优等多个方面。对于开发者来说,理解并熟练运用这些概念和语法是进行高效数据库管理和开发的基础。通过...

    Oracle中Cursor介绍[归类].pdf

    Oracle中的Cursor,也称为游标,是数据库管理系统中一个重要的概念,主要用于处理SQL查询返回的多行结果集。游标提供了一种方式,允许程序逐行处理查询结果,而不是一次性加载所有数据。以下是对游标分类及其特性的...

    《ORACLE SQL 高级编程》随书脚本

    《ORACLE SQL 高级编程》是一本专为Oracle数据库用户设计的专业书籍,旨在帮助读者深入理解和掌握Oracle SQL的高级特性。"Pro Oracle SQL"是该书的英文原名,对于那些希望在Oracle SQL领域深化技能的人来说,这本书...

    oracle sql语句学习

    此外,理解Oracle SQL的性能调优也非常重要,这涉及到查询优化、索引策略、表设计和存储优化等方面。在深入学习过程中,你可能会接触到SQL执行计划、EXPLAIN PLAN等工具,这些都是提升SQL性能的关键。 总的来说,...

    pkg_XXX.rar_oracle_oracle record cursor

    综上所述,"pkg_XXX.rar_oracle_oracle record cursor" 文件中的内容涵盖了Oracle数据库开发的多个重要方面,是学习和理解Oracle存储过程、游标、记录、动态SQL和临时表操作的宝贵资源。通过深入研究和实践这些示例...

    大型项目Oracle sql,function,procedures,package,cursor,job

    标题和描述中提到的“大型项目Oracle sql,function,procedures,package,cursor,job”涉及的是Oracle数据库管理和开发的核心概念。以下是对这些概念的详细解释: 1. **SQL(Structured Query Language)**:SQL...

    oracle到sqlserver存储过程语法转换

    ### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...

    oracle与SQL server的语法差异总结

    Oracle 和 SQL Server 是两种广泛应用的关系型...这些对比可以帮助开发者理解和适应在Oracle与SQL Server之间切换时可能遇到的不同语法和使用习惯。理解这些差异对于在两个系统间进行迁移或开发跨平台应用至关重要。

    Oracle官方文档CHM合集-SQL参考手册 Oracle教程 Oracle开发

    9. **游标与动态SQL**:游标(CURSOR)允许逐行处理查询结果,而动态SQL(EXECUTE IMMEDIATE)允许在运行时构建和执行SQL语句,适应变化的需求。 10. **触发器与约束**:触发器(TRIGGER)是自动执行的数据库对象,...

    Oracle SQL最佳实践

    - **参数调整:** 可以通过调整 Oracle 的参数来优化 SQL 的执行计划,如设置合适的 `cursor_sharing` 参数值等。 4. **使用绑定变量:** - **绑定变量的使用:** 当应用程序需要频繁执行相同的 SQL 但每次传入的...

    ORACLE SQL的性能优化

    在探讨Oracle SQL性能优化之前,首先需理解Oracle处理SQL语句的基本流程,这是提升性能的关键所在。Oracle SQL的执行过程大致分为以下几个阶段: - **查询语句处理** - **DML语句处理**(Insert, Update, Delete) ...

    OracleSQL.zip_oracle

    这份"OracleSQL.zip_oracle"压缩包包含了有关Oracle SQL的详细文档,名为"Oracle_SQL语句大全.doc",旨在提供全面的Oracle SQL语法和用法指南。 1. **SQL基础**:SQL(Structured Query Language)是用于管理和处理...

    oracle的sql语句和语法

    Oracle数据库是世界上最流行的数据库管理系统之一,它广泛应用于企业...对于初学者来说,理解并掌握这些基础知识是开始探索Oracle数据库的第一步。通过不断地实践和学习,你将能够更好地利用Oracle SQL处理和管理数据。

    Oracle动态执行SQL四种方式的例子

    在Oracle数据库管理中,动态执行SQL语句是一种强大的功能,允许开发者在运行时构建和执行SQL语句,这对于处理不确定或变化的数据结构尤其有用。本文将深入探讨Oracle中动态执行SQL的四种主要方法,并通过具体示例...

    oracle的SQL语句的一些经验总结

    Oracle SQL语句是数据库管理员和开发人员在处理Oracle数据库时不可或缺的工具。它允许用户查询、更新、插入和删除数据,以及执行各种复杂的数据库操作。以下是对"Oracle的SQL语句的一些经验总结"中可能涉及的关键...

    oracle-cursor.rar_oracle

    Oracle游标是数据库管理系统中一个重要的概念,它在处理复杂SQL操作时扮演着核心...理解并有效利用Oracle游标是编写高效PL/SQL代码的关键。通过熟练掌握游标的用法和注意事项,可以更好地管理和处理数据库中的数据。

Global site tag (gtag.js) - Google Analytics