加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer之游标深入

发布时间:2020-12-12 13:07:26 所属栏目:MsSql教程 来源:网络整理
导读:原创文章,转载必需注明出 处: http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-cursor-2/ 上一节我们简单讲解了 SqlServer的游标的简单创建,本节我们将根据msdn上的创建游标代码来详细讲解游标的创建、以及其特性。 D

原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-cursor-2/

上一节我们简单讲解了SqlServer的游标的简单创建,本节我们将根据msdn上的创建游标代码来详细讲解游标的创建、以及其特性。

DECLARE?cursor_name?CURSOR?[?LOCAL?|?GLOBAL?]?
?????[?FORWARD_ONLY?|?SCROLL?]?
?????[?STATIC?|?KEYSET?|?DYNAMIC?|?FAST_FORWARD?]?
?????[?READ_ONLY?|?SCROLL_LOCKS?|?OPTIMISTIC?]?
?????[?TYPE_WARNING?]?
?????FOR?select_statement?
?????[?FOR?UPDATE?[?OF?column_name?[?,...n?]?]?]
[;]

一、创建游标

(a)、LOCAL?和GLOBAL?

就像C#或C++等编程语言一样,使用sql语言创建游标也可以创建全局游标和局部游标。Local意味着游标的声明周期在函数获得存储过程中是可用的,Global意味着游标全局有效。如果不指定游标作用域,默认作用域为Global

如下:

declare?@table?Table(Id?int)
declare?@i?int=0
while?@i<100
begin
	insert?into?@table?values(@i)
	set?@i=@i+1;
end
?
declare?My_Cursor1?cursor?global?for?select?*?from?@table
declare?My_Cursor2?cursor?local?for?select?*?from?@table
declare?My_Cursor3?cursor?for?select?*?from?@table
?
go
open?My_Cursor1
open?My_Cursor2
open?My_Cursor3

(b)、?FORWARD_ONLY?和?SCROLL

游标是针对数据集的,那么它在读取数据集的时候就有其读取数据的方向。?FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH?NEXT是唯一的选项,而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动,如下:

--不加参数默认为forward_only
declare?My_Cursor1?cursor?for?select?*?from?@table
declare?My_Cursor2?cursor?forward_only?for?select?*?from?@table
declare?My_Cursor3?cursor?scroll?for?select?*?from?@table
?
open?My_Cursor1
open?My_Cursor3
open?My_Cursor3
?
fetch?last?from?My_Cursor1
fetch?last?from?My_Cursor2
fetch?last?from?My_Cursor3

(c)、[?STATIC?|?KEYSET?|?DYNAMIC?|?FAST_FORWARD?]?

?????[?READ_ONLY?|?SCROLL_LOCKS?|?OPTIMISTIC?]?

至于上面几种情况笔者也不是太了解,就先跳过介绍

?

二、打开游标

创建完成游标后我们还要打开游标才能正确的使用游标:代码如下:

open?My_Cursor1
open?My_Cursor3
open?My_Cursor3

三、使用游标

使用游标分为两部分:一是操作游标的指向,二是操作游标指向的数据行。

游标支持使用6中指向操作。分别是:第一行(first),最后一行(LAST),下一行(next),上一行(prior),直接跳到某一行(absoluten),相对于目前跳几行(relative(n)),代码如下:

--指定参数scroll后方可使用6种游标指向参数,对于未指定scroll参数的则默认读取下一行数据
declare?@id?int?
declare?My_Cursor?cursor?scroll?for?select?*?from?@table
open?My_Cursor
--指向下一行数据
fetch?next?from?My_Cursor?into?@id
--指向上一行数据
fetch?prior?from?My_Cursor?into?@id
--指向第一行数据
fetch?first?from?My_Cursor?into?@id
--指向最后一行数据
fetch?last?from?My_Cursor?into?@id
--直接跳转到某行数据
fetch?absolute?12?from?My_Cursor?into?@id
--相对于目前来说上两行数据
fetch?relative?-2?from?My_Cursor?into?@id

游标经常会和全局变量@@FETCH_STATUS与WHILE循环来共同使用,以达到遍历游标所在数据集的目的,例如:

declare?@id?int?
declare?My_Cursor?cursor?scroll?for?select?*?from?@table
open?My_Cursor
--指向下一行数据
fetch?next?from?My_Cursor?into?@id
while?@@FETCH_STATUS=0
begin
	select?@id
End

四、关闭游标

游标使用完后必须要关闭,代码如下:

close?My_Cursor

五、释放游标

当游标不再需要被使用后,释放游标。代码如下:

deallocate?My_Cursor

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读