设为首页 加入收藏

TOP

菜鸟的DBA之路[MSSQL篇] 详解游标 (二)
2014-11-24 02:49:48 来源: 作者: 【 】 浏览:18
Tags:菜鸟 DBA 之路 MSSQL篇 详解 游标
rm01 , @Parm02 , @Parm03

1 UPDATE PPS_App_Infomation SET GameName ='熬夜虫子forupdate' WHERE CURRENT OF cur_Pay

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

3 END

消息16929,级别16,状态1,第9 行

游标是只读的。

语句已终止。熬夜虫子__Maoya__06 20 2009 1:32PM

1 DECLARE cur_Pay INSENSITIVE SCROLL CURSOR FOR

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

3 FOR UPDATE

消息1048,级别15,状态1,第7 行

游标选项FOR UPDATE 和INSENSITIVE 冲突。

01 DECLARE cur_Pay SCROLL CURSOR FOR

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

03 FOR Update

04 OPEN cur_Pay

05 BEGIN

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

07 UPDATE PPS_App_Infomation SET GameName ='熬夜虫子forupdate' WHERE CURRENT OF cur_Pay

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

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

10 END

(1 行受影响)

熬夜虫子forupdate__Maoya__06 20 2009 1:32PM

READ ONLY不允许通过游标进行定位更新,并且不持有针对组成结果集的行的锁。UPDATE与READ ONLY相对,并且UPDATE可以定义到可更新的列。

语法基础(SQL SERVER扩展格式)

基础数据同上

01 DECLARE @Parm01 varchar(100)

02 DECLARE @Parm02 varchar(100)

03 DECLARE @Parm03 varchar(100)

04 DECLARE cur_Pay CURSOR

05 GLOBAL --和SQL-92格式同理 可选LOCAL本地游标

06 SCROLL --可选FORWARD_ONLY 指定游标只能从第一行滚动到最后一行

07 DYNAMIC --和上一行参数关联static表示临时副本DYNAMIC直接反映在滚动游标时对结果集内行所做的修改

08 --keyset表示除了唯一键其他都获取最新值FAST_FORWARD性能优化的FOR_WARD READONLY游标

09 OPTIMISTIC --可选READ_ONLY同上SCROLL_LOCKS定位更新并对当前数据加锁OPTIMISTIC想当与乐观锁可以进行更新动作但是如果读取的数据被更新会导致操作失败

10 TYPE_WARNING --如果游标从所请求的类型隐形转换到另一种类型,则给客户端发送警告

11 FOR

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

13 FOR UPDATE

14 OPEN cur_Pay

15 BEGIN

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

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

18 END

19 DEALLOCATE cur_Pay

相关语法都直接注释在code里了 和SQL-92相似的部分就不赘述了

游标应用

定义游标变量cursor_variable_name

declare @tcur cursor

set @tcur = cursor for SELECT * FROM PPS_App_Infomation

打开游标OPEN {{[GLOBAL]cursor_name}|cursor_variable_name}

关闭游标CLOSE{{[GLOBAL]cursor_name}|cursor_variable_name}

释放游标DEALLOCATE{{[GLOBAL]cursor_name}|cursor_variable_name}

获取游标行数@@CURSOR_ROWS

1 DECLARE cur_Pay INSENSITIVE SCROLL CURSOR FOR

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

3 OPEN cur_Pay

4 BEGIN

5 PRINT @@CURSOR_ROWS

6 END

输出4

检测fetch操作的状态@@FETCH_STATUS 返回值0表示fetch语句执行成功-1表示fetch语句执行失败或此行不再结果集中-2表示所要读取的数据信息不存在

1 DECLARE cur_Pay INSENSITIVE SCROLL CURSOR FOR

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

3 FETCH next FROM cur_Pay

4 OPEN cur_Pay

5 BEGIN

6 if(@@FETCH_STATUS = 0) print('FETCH 语句成功')

7 if(@@FETCH_STATUS = -1) print('FETCH 语句失败或行不在结果集中')

8 if(@@FETCH_STATUS = -2) print('提取的行不存在')

9 END

消息 16917,级别 16,状态 2,第 6 行
游标未打开。
FETCH 语句失败或行不在结果集中

游标嵌套

在游标中使用另一个游标。一般来说使用游标已经很占用系统资源了,再嵌套游标会大影响效率,本文只作参考用。

添加一张数据表PPS_AppConfig_Infomation

\

01 DECLARE @Parm01 int

02 DECLARE @Parm02 varc

首页 上一页 1 2 3 下一页 尾页 2/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)