认识静态与动态游标

本文介绍了数据库中静态与动态游标的使用特点及其差异。静态游标创建数据的临时副本,不受外部数据更改的影响;而动态游标则能实时反映数据变化。通过具体示例演示了两种游标在循环过程中的不同表现。

认识静态与动态游标

背景:

静态(STATIC)游标创建将由该游标使用的数据的临时复本。对游标的所有请求都从tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改

动态(DYNAMIC) 游标会反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持ABSOLUTE 提取选项。

不指定STATIC 关键字的时候, 默认定义的游标是动态(DYNAMIC)

如果很在意游标的类型, 应该在定义游标的时候, 加上游标类型定义的关键字, 并加上TYPE_WARNING 关键字, 以便在游标类型不是预期的情况下, 收到警告信息

 

演示:

下面的演示针对 STATICDYNAMIC 游标, 显示两者在游标循环期的差异

-- 定义演示数据

IF OBJECT_ID('tempdb..#tb')IS NOT NULL

    DROPTABLE #tb

CREATETABLE #tb(

    id intPRIMARY KEY,

    col sysname)

INSERT #tb(

    id, col)

SELECT 1,'AA' UNION ALL

SELECT 2,'BB' UNION ALL

SELECT 3,'CC' UNION ALL

SELECT 4,'DD'

 

-- 游标测试

DECLARE CUR_tbCURSOR LOCAL FORWARD_ONLY READ_ONLY TYPE_WARNING DYNAMIC--STATIC

FOR          

SELECT

    id, col

FROM #tb

 

-- 游标打开前删除记录

DELETETOP (1)

FROM #tb

WHERE id= 4

SELECT'before cursor open',* FROM #tb

 

-- 打开游标

OPEN CUR_tb

 

-- 游标打开后删除记录

DELETETOP (1)

FROM #tb

WHERE id= 3

SELECT'after cursor open',* FROM #tb

FETCH CUR_tb

WHILE @@FETCH_STATUS = 0

BEGIN

    -- 游标循环中删除记录

    DELETETOP (1)

    FROM #tb

    WHERE id= 2

 

    FETCH CUR_tb

END

CLOSE CUR_tb

DEALLOCATE CUR_tb
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值