zoukankan      html  css  js  c++  java
  • 【转】静态游标和动态游标

    静态游标在打开时会将数据集存储在tempdb中,因此显示的数据与游标打开时的数据集保持一致,在游标打开以后对数据库的更新不会显示在游标中。

     

    动态游标在打开后会反映对数据库的更改。所有UPDATE、INSERT 和 DELETE 操作都会显示在游标的结果集中,结果集中的行数据值、顺序和成员在每次提取时都会改变。

    在定义游标的时候如果不指定STATIC关键字,默认是DYNAMIC的。

    动态游标的打开速度比静态游标的打开速度快。当打开静态游标时,必须生成内部临时工作表,而动态游标则不需要。

    在联接中,静态游标的速度可能比动态游标的速度快。因为动态游标在滚动时反应对结果集内的各行数据所做的更改,它会消耗资源去检测基表的更改,因此对于复杂的查询,且不需要反映基表的更新的游标的处理应将其定义为静态游标。

    如果要进行绝对提取,必须使用由键集驱动的游标或静态游标。

    在使用动态游标时,应该注意行数据的更新所导致的死循环等问题,如下表所示:

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    CREATE TABLE [dbo].[Test](

          [ID] [int] NOT NULL,

     CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([ID] ASC)) ON [PRIMARY]

    GO

    INSERT INTO Test VALUES(1)

    GO

    DECLARE C$Cursor Cursor

    FOR

    SELECT ID From Test Where ID < 10

    DECLARE @id INT

    OPEN C$Cursor

    Fetch  C$Cursor INTO @id

    WHILE @@FETCH_STATUS = 0

    BEGIN

          UPDATE Test SET ID = ID + 1 WHERE id = @id

          Fetch  C$Cursor INTO @id

    END

    CLOSE C$Cursor

    DEALLOCATE C$Cursor

    执行完后表中的数值变成了10,代表更新行执行了多次。如果把游标的定义改成如下:

    DECLARE C$Cursor Cursor STATIC

    FOR

    SELECT ID From Test Where ID < 10

    则执行结果为2

  • 相关阅读:
    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
    简单的使用SLF4J门面和log4j
    详细的Log4j使用教程
    java的Mybatis动态代理方式(二)
    java的一个基础的Mybatis例子(一)
    java的注解学习
    ArrayList输出的几种方法
    自己写的一个java链接数据库的类
    ipv4的TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)
    tomcat的CATALINA_HOME环境变量可以不用设置
  • 原文地址:https://www.cnblogs.com/gates/p/4149182.html
Copyright © 2011-2022 走看看