设为首页 加入收藏

TOP

菜鸟的DBA之路[MSSQL篇] 详解游标 (一)
2014-11-24 02:49:48 来源: 作者: 【 】 浏览:19
Tags:菜鸟 DBA 之路 MSSQL篇 详解 游标

前篇回顾:上一篇虫子介绍了一些不常用的数据过滤方式,本篇详细介绍下游标。

概念

简单点说游标的作用就是存储一个结果集,并根据语法将这个结果集的数据逐条处理。


观点

正因为游标可以将结果集一条条取出处理,所以会增加服务器的负担。再者使用游标的效率远远没有使用默认的结果集效率高,在默认结果集中,从客户端发送到服务器的唯一一个数据包是包含需执行语句的数据包。而在使用服务器游标时,每一个FETCH语句都必须从客户端发送到服务器,然后在服务器中将它解析并编译为执行计划。除非要再sqlserver上进行很复杂的数据操作。


基本知识

一. SQL Server 2005 支持两种请求游标的方法

  1.Transact-SQL (支持 SQL-92);

  2.数据库应用程序编程接口(API)游标函数(ADO、OLE DB、ODBC)应用程序不能混合使用这两种请求游标的方法。ODBC 还支持客户端游标,即在客户  端实现的游标。

二. 游标根据范围可以分成全局游标和局部游标。全局游标可以在整个会话过程中使用,局部游标只能在一个T-SQL批、存储过程或触发器中执行,当执行完毕后局部游标会自动删除。

三. 游标的基本操作,定义游标、打开游标、循环读取游标、关闭游标和删除游标。


语法基础(SQL-92)

以SQL-92方式为例

初始数据PPS_App_Infomation

\


01 DECLARE @Parm01 varchar(100)

02 DECLARE @Parm02 varchar(100)

03 DECLARE @Parm03 varchar(100)

04 DECLARE cur_Pay INSENSITIVE CURSOR FOR

05 SELECT GameName,CreateUser,CreateDate FROM [PicPromotion].[dbo].[PPS_App_Infomation]

06 OPEN cur_Pay

07 FETCH cur_Pay INTO @Parm01 , @Parm02 , @Parm03

08 WHILE @@FETCH_STATUS = 0

09 BEGIN

10 WAITFOR DELAY '00:00:01'

11 PRINT @Parm01+'__'+@Parm02+'__'+@Parm03

12 FETCH cur_Pay INTO @Parm01 , @Parm02 , @Parm03

13 END

14 DEALLOCATE cur_Pay

其中 cur_Pay为游标名称 INSENSITIVE 用于设置游标是否使用副本 OPEN 打开游标 fetch循环读入游标 DEALLOCATE 删除游标

INSENSITIVE

举个简单的例子 在游标读取过程中 我们将熬夜虫子改成早起虫子看看 是否添加INSENSITIVE 会是什么样的区别

\ \

前一个有INSENSITIVE 关键字使用数据副本,后一个无INSENSITIVE 是即时数据

游标的敏感性行为定义了对基行(用于建立游标)所做的更新是否对游标可见。敏感性也定义了能否通过游标进行更新。

scroll

我们再来看看scroll关键字

01 DECLARE @Parm01 varchar(100)

02 DECLARE @Parm02 varchar(100)

03 DECLARE @Parm03 varchar(100)

04 DECLARE cur_Pay INSENSITIVE SCROLL CURSOR FOR

05 SELECT GameName,CreateUser,CreateDate FROM [PicPromotion].[dbo].[PPS_App_Infomation]

06 OPEN cur_Pay

07 BEGIN

08 FETCH LAST FROM cur_Pay INTO @Parm01 , @Parm02 , @Parm03

09 PRINT @Parm01+'__'+@Parm02+'__'+@Parm03

10 END

11 DEALLOCATE cur_Pay

上面的程序是ok的 成功输出 熬夜虫子__Maoya__06 20 2009 1:32PM

如果去掉SCROLL关键字会提示

消息16911,级别16,状态1,第8 行

fetch: 提取类型last 不能与只进游标一起使用。

SCROLL通过Transact-SQL服务器游标检索特定行。如果SCROLL 选项未在SQL-92样式的DECLARE CURSOR语句中指定,则NEXT是唯一受支持的FETCH 选项。如果在SQL-92样式的DECLARE CURSOR语句中指定了SCROLL 选项,则支持所有FETCH 选项。

FETCH 语法

除了last参数(返回游标中的最后一行并将其作为当前行)再介绍下其他的

NEXT 紧跟当前行返回结果行,并且当前行递增为返回行。如果FETCH NEXT为对游标的第一次提取操作,则返回结果集中的第一行NEXT为默认的游标提取选项。

PRIOR 返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。

FIRST 返回游标中的第一行并将其作为当前行。

ABSOLUTE { n | @nvar}

如果n 或@nvar 为正数,则返回从游标头开始的第n 行,并将返回行变成新的当前行。如果n 或@nvar 为负数,则返回从游标末尾开始的第n 行,并将返回行变成新的当前行。如果n 或@nvar 为0,则不返回行。n 必须是整数常量,并且@nvar 的数据类型必须为smallint、tinyint 或int。

RELATIVE { n | @nvar}

如果n 或@nvar 为正数,则返回从当前行开始的第n 行,并将返回行变成新的当前行。如果n 或@nvar 为负数,则返回当前行之前第n 行,并将返回行变成新的当前行。如果n 或@nvar 为0,则返回当前行。在对游标完成第一次提取时,如果在将n 或@nvar 设置为负数或0 的情况下指定FETCH RELATIVE,则不返回行。n 必须是整数常量,@nvar 的数据类型必须为smallint、tinyint 或int。

定义全局游标

FETCH NEXT FROM GLOBAL cur_Pay INTO @Parm01 , @Parm02 , @Parm03

如果未指定GLOBAL,则指局部游标。

READ ONLY 与UPDATE

(下文中只摘要不重复或者必要的代码)

1 DECLARE cur_Pay INSENSITIVE SCROLL CURSOR FOR

2 SELECT GameName,CreateUser,CreateDate FROM [PicPromotion].[dbo].[PPS_App_Infomation]

3 FOR READ ONLY

4 OPEN cur_Pay

5 BEGIN

6

7 FETCH LAST FROM cur_Pay INTO @Pa

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇减少SQL日志的方法 下一篇让数据库游标变得简单

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Sphinx : 高性能SQL (2025-12-24 10:18:11)
·Pandas 性能优化 - (2025-12-24 10:18:08)
·MySQL 索引 - 菜鸟教 (2025-12-24 10:18:06)
·Shell 基本运算符 - (2025-12-24 09:52:56)
·Shell 函数 | 菜鸟教 (2025-12-24 09:52:54)