SQLServer技术(85)

来源:互联网 发布:窦唯官方淘宝店 编辑:程序博客网 时间:2024/04/30 15:58
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

13.5.1关闭游标
    1、使用CLOSE命令关闭游标
     在处理完游标中数据之后必须关闭游标来释放数据结果集和定位于数据记录上的锁。CLOSE语句关闭游标,但不释放游标占用的数据结构。如果准备在随后的使用中再次打开游标,则应使用CLOSE命令。其关闭游标的语法规则为:
 CLOSE{{[GLOBAL]cursor_name}|cursor_variable_name}
    2、自动关闭游标
    我们已经了解到游标可应用在存储过程、触发器和Transact_SQL脚本中。如果在声明游标与释放游标之间使用了事务结构,则在结束事务时游标会自动关闭。其具体的情况如下所示:
(1)、声明一个游标
(2)、打开游标
(3)、读取游标
(4)、BEGINTRANSATION
(5)、数据处理
(6)、COMMITTRANSATION
(7)、回到步骤3
    在这样的应用环境中。当从游标中读取一条数据记录进行以BEGINTRANSATION为开头,COMMITTRANSATION或ROLLBACK为结束的事务处理时,在程序开始运行后,第一行数据能够被正确返回,经由步骤7,程序回到步骤3,读取游标的下一行,此时常会发现游标未打开的错误信息。其原因就在于当一个事务结束时,不管其是以COMMITTRANSATION还是以ROLLBACKTRANSATION结束,MSSQLServer都会自动关闭游标,所以当继续从游标中读取数据时就会造成错误。
    解决这种错误的方法就是使用SET命令将CURSOR_CLOSE_ON_COMMIT这一参数设置为OFF状态。其目的就是让游标在事务结束时仍继续保持打开状态,而不会被关闭。使用SET命令的格式为:
 SETCURSOR_CLOSE_ON_COMMITOFF

13.5.2释放游标
    在使用游标时,各种针对游标的操作或者引用游标名,或者引用指向游标的游标变量。当CLOSE命令关闭游标时,并没有释放游标占用的数据结构。因此常使用DEALLOCATE命令。通过该命令可以删除掉游标与游标名或游标变量之间的联系,并且释放游标占用的所有系统资源。其语法规则为:
    DEALLOCATE{{[GLOBAL]cursor_name}|@cursor_variable_name}
    各参数的含义参看13.3打开游标一节。
    当使用DEALLOCATE@cursor_variable_name来删除游标时,游标变量并不会被释放,除非超过使用该游标的存储过程、触发器的范围(即游标的作用域)。


13.5.3游标变量
    游标变量是从MSSQLServer7版本才开始使用的一种新增数据类型。定义一个游标变量主要有两种方法。
    首先我们先声明一个游标。


    使用SET语句将一游标赋值给游标变量:

    将声明游标语句放在游标赋值语句中,如下所示:

    例13-5:下面给出一个具体完整的例子,在该例子中我们对DEALLOCATE命令将有更加清晰的了解。



<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击