`

游标的详解

 
阅读更多
引用:http://www.dotnetdev.cn/2010/01/t-sql%E6%B8%B8%E6%A0%87%E8%AF%A6%E8%A7%A3/
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

一、游标的组成
游标包含两个部分:一个是游标结果集、一个是游标位置。
游标结果集:定义该游标得SELECT语句返回的行的集合。游标位置:指向这个结果集某一行的当前指针。

二、游标概述
游标是基于Declare Cursor 语法,主要用于Transaction-SQL脚本、存储过程以及触发器中。Transaction-SQL游标在服务器处理由客户端发送到服务器的Transaction-SQL语句。
在存储过程或触发器中使用Transaction-SQL游标的过程为:
1. 声明Transaction-SQL变量包含游标返回的数据。为每个结果集列声明一个变量。声明足够大的变量来保存列返回的值,并声明变量的类型为可从数据类型隐式转换得到的数据类型。
2. 使用Declare Cursor语句将Transaction-SQL游标与Select语句相关联。还可以利用Declare Cursor定义游标的只读、只进等特性。
3. 使用Open语句执行Select语句填充游标。
4. 使用Fetch Into语句提取单个行,并将每列中得数据移至指定的变量中。注意:其他Transaction-SQL语句可以引用那些变量来访问提取的数据值。Transaction-SQL游标不支持提取行块。
5. 使用Close语句结束游标的使用。注意:关闭游标以后,该游标还是存在,可以使用Open命令打开继续使用,只有调用Deallocate语句才会完全释放。

三、游标的生命周期
游标的生命周期包含有五个阶段:声明游标、打开游标、读取游标数据、关闭游标、释放游标。
声明游标是为游标指定获取数据时所使用的Select语句,声明游标并不会检索任何数据,它只是为游标指明了相应的Select 语句。
Declare 游标名称 Cursor 参数

声明游标的参数
1. Local与Global:Local表示游标的作用于仅仅限于其所在的存储过程、触发器以及批处理中、执行完毕以后游标自动释放。Global表示的是该游标作用域是整个会话层。由连接执行的任何存储过程、批处理等都可以引用该游标名称,仅在断开连接时隐性释放。
2. Forward_only与Scroll:前者表示为只进游标,后者表示为可以随意定位。默认为前者。
3. Static、Keyset与Dynamic: 第一个表示定义一个游标,其数据存放到一个临时表内,对游标的所有请求都从临时表中应答,因此,对该游标进行提取操作时返回的数据不反映对基表所作的修改,并且该游标不允许修改。Keyset表示的是,当游标打开时,键集驱动游标中行的身份与顺序是固定的,并把其放到临时表中。Dynamic表示的是滚动游标时,动态游标反映对结果集内所有数据的更改。
4. Read_only 、Scroll_Locks与Optimistic:第一个表示的是只读游标,第二个表示的是在使用的游标结果集数据上放置锁,当行读取到游标中然后对它们进行修改时,数据库将锁定这些行,以保证数据的一致性。Optimistic的含义是游标将数据读取以后,如果这些数据被更新了,则通过游标定位进行的更新与删除操作将不会成功。

标准游标:
Declare MyCursor Cursor
For Select * From Master_Goods

只读游标
Declare MyCusror Cursor
For Select * From Master_Goods
For Read Only

可更新游标
Declare MyCusror Cursor
For Select * From Master_Goods
For UpDate

打开游标使用Open语句用于打开Transaction-SQL服务器游标,执行Open语句的过程中就是按照Select语句进行填充数据,打开游标以后游标位置在第一行。

打开游标

* 全局游标:Open Global MyCursor
* 局部游标: Open MyCursor

读取游标数据:在打开游标以后,使用Fetch语句从Transaction-SQL服务器游标中检索特定的一行。使用Fetch操作,可以使游标移动到下一个记录,并将游标返回的每个列得数据分别赋值给声明的本地变量。

Fetch [Next | Prior | First | Last | Absolute n | Relative n ]  From MyCursor

Into @GoodsID,@GoodsName

其中:Next表示返回结果集中当前行的下一行记录,如果第一次读取则返回第一行。默认的读取选项为Next

Prior表示返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。

First表示返回结果集中的第一行,并且将其作为当前行。

Last表示返回结果集中的最后一行,并且将其作为当前行。

Absolute n 如果n为正数,则返回从游标头开始的第n行,并且返回行变成新的当前行。如果n为负,则返回从游标末尾开始的第n行,并且返回行为新的当前行,如果n为0,则返回当前行。

Relative n 如果n为正数,则返回从当前行开始的第n行,如果n为负,则返回从当前行之前的第n行,如果为0,则返回当前行。

关闭游标调用的是Close语句,方式如下:

Close Global MyCursor
Close MyCursor

释放游标调用的是Deallocate语句,方法如下:

Deallocate Glboal MyCursor
Deallocate MyCursor

游标实例:

–声明游标

1234567891011121314151617181920212223242526 Declare MyCusror Cursor Scroll--只进游标 FORWARD_ONLY --将游标对应的表中的记录进行锁定。从而防止用户修改。 SCROLL_LOCKS  For Select * From Master_Goods Order By GoodsID --打开游标 Open MyCursor --读取游标的值到@GoodsCode,@GoodsName Fetch next From MyCursor  Into @GoodsCode,@GoodsName --循环状态读取游标成功 While(@@Fetch_Status = 0)  Begin Select @GoodsCode = Convert(Char(20),@GoodsCode)  Select @GoodsName = Convert(Char(20),@GoodsName)  PRINT @GoodsCode + ':' + @GoodsName    --读取下一行游标  Fetch next From MyCursor  Into @GoodsCode,@GoodsName  End--关闭游标 Close MyCursor --释放游标 Deallocate MyCursor

修改当前游标的数据方法如下:

UpDate Master_Goods Set GoodsName = ‘yangyang8848′ Where Current Of MyCursor;

删除当前游标行数据的方法如下:

Delete From Master_Goods Where Current Of MyCursor

Select @@CURSOR_ROWS 可以得到当前游标中存在的数据行数。注意:此变量为一个连接上的全局变量,因此只对应最后一次打开的游标。

分享到:
评论

相关推荐

    存储过程和游标详解

    ### 存储过程和游标详解 #### 一、存储过程概述 存储过程,作为数据库管理系统(DBMS)中的一种重要特性,尤其在Oracle等关系型数据库中被广泛应用。它允许开发者将一系列SQL语句和控制流语句组合在一起,封装为一个...

    Oracle存储过程游标详解

    "Oracle存储过程游标详解" Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。游标可以分为静态游标和REF游标两种类型。静态游标是指结果集已经确实(静态定义)的游标,可以进一步...

    Mysql中sql语句游标详解

    ### MySQL中SQL语句游标详解 #### 一、引言 在数据库开发过程中,当开发者需要逐条处理从查询结果集中获取的数据时,游标成为了一种非常实用且强大的工具。本文旨在深入探讨MySQL中游标的概念及其使用方法,帮助...

    父子游标详解[收集].pdf

    父子游标详解 父子游标是 Oracle 中的一种机制,用于优化 SQL 语句的执行。它通过共享游标来减少开销,提高系统性能。下面是关于父子游标的详细解释: 1. 父游标和子游标 在 Oracle 中,每个 SQL 语句执行时,...

    mysql游标详解

    MySQL 游标详解 MySQL 从 5.0 版本开始支持存储过程和触发器,而游标在递归树结构中非常有用。游标是 MySQL 中的一种机制,允许开发人员在存储过程和触发器中控制数据的获取和处理。 在 MySQL 中,游标是通过 ...

    sql 游标详解

    ### SQL 游标详解 #### 一、游标的基本概念 在SQL中,游标是一种特殊的指针,用于逐行地检索查询结果。这与一般的SQL查询不同,后者通常是返回所有匹配的结果集。游标提供了对从表或多个表中获取的数据进行遍历的...

    MS SQL SERVER 游标详解

    在MS SQL SERVER中,游标是一项关键功能,它允许开发者逐行处理查询结果集,而不仅仅是一次性处理所有数据。游标对于那些需要按顺序访问或处理数据的应用场景尤其有用,例如在循环中处理数据记录或者根据当前行状态...

    oracle 游标 深入浅出 详解 精析 示例

    Oracle游标是数据库管理系统中的一种重要机制,它允许程序员逐行处理查询结果集,而不仅仅是一次性获取所有数据。游标类似于C语言中的指针,能够灵活、高效地处理多条记录,尤其在需要循环处理或者根据当前行数据做...

    Oracle存储过程、游标、函数的详解

    ### Oracle存储过程、游标、函数的详解 #### 一、概述 在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作...

    MongoDB 游标详解及实例代码

    MongoDB 游标详解 MongoDB中的游标与关系型数据库中的游标在功能上大同小异。游标相当于C语言的指针,可以定位到某条记录,在MongoDB中,则是文档。因此在mongoDB中游标也有定义,声明, 打开,读取,关闭这么个过程...

    oracle 隐式游标,显示游标,游标循环

    ### Oracle中的游标详解 #### 一、引言 在Oracle数据库中,游标是一种非常重要的机制,它允许用户在程序中对查询结果进行逐行处理。游标分为两种主要类型:**隐式游标**和**显示游标**。此外,还可以利用游标进行...

    Oracle游标使用详解

    根据提供的标题、描述以及部分代码内容,我们可以详细探讨Oracle游标的使用方法,特别是明确游标(Explicit Cursor)和隐式游标(Implicit Cursor)的区别及其具体应用方式。 ### Oracle游标简介 在Oracle数据库中...

    oracle游标和异常处理

    #### 二、隐式游标详解 隐式游标是由Oracle自动创建和管理的,主要用于处理单行数据。常见的隐式游标操作包括: - **INSERT**:插入操作。 - **UPDATE**:更新操作。 - **DELETE**:删除操作。 - **SELECT INTO**...

    Oracle游标大全

    ### Oracle游标详解 #### 一、概述 在Oracle数据库中,游标是一种重要的机制,用于处理查询结果集。游标允许用户通过编程的方式逐一访问查询结果中的每一行数据,而不是一次性加载所有数据到内存中。这使得游标...

    Oracle 游标 Oracle 游标

    ### Oracle游标详解 在Oracle数据库中,游标(Cursor)是处理数据集的一个关键机制,主要用于执行查询并逐行处理结果集。游标可以被视为一个临时存储区,用于保存SELECT语句的结果集,允许程序对这些结果进行迭代...

    sqlserver游标深解

    #### 二、Transact-SQL 游标详解 **2.1 创建游标** 创建游标是使用游标的第一步。以下是一个创建名为 `CustomerCursor` 的游标示例,该游标将从 `customer` 表中选择所有账号编号、姓名和余额,其中 `province` ...

    MySQL游标概念与用法详解

    本文实例讲述了MySQL游标概念与用法。分享给大家供大家参考,具体如下: 1、游标的概念(Cursor) 一条sql,对应N条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行。如果开发过安卓的同学应该知道有一...

    ORACLE 游标

    ### ORACLE 游标详解 在Oracle数据库中,游标是一种强大的工具,用于处理查询结果集,特别是当结果集包含多行数据时。游标允许我们一行行地处理查询结果,这在处理大量数据或需要对每行结果进行特定操作时尤为有用...

    MySQL游标:数据库操作的精准定位器

    ### MySQL 游标详解:数据库操作的精准定位器 #### MySQL 概览 MySQL 是一个广泛应用的开源关系型数据库管理系统(RDBMS),是LAMP技术栈的重要组成部分,该技术栈包括Linux操作系统、Apache Web服务器、MySQL...

Global site tag (gtag.js) - Google Analytics