SQL Server数据库游标的基本操作指南
作者:菇毒
1. 声明游标
游标主要由结果集合游标位置组成的,结果集是 SELECT 语句
执行后返回的,而游标位置是指向返回结果集中的指针;
使用游标前必须对游标进行声明;
在 SQL Server 数据库中,使用 DECLARE CURSOR 语句
对游标进行声明;
游标的声明要对游标的滚动行为、游标所操作的结果集进行设置;
游标的声明语法格式如下:
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FRO select_seatement [ FRO UPDATE [ OF column_name [,..n] ] ]
- cursor_name:指定要声明游标的名称;
- LOCAL:指定游标的作用域,LOCAL 表示游标的作用域局部;
- FORWARD_ONLY:指定游标只能从第一个记录向下滚动到最后一条记录;
- STATIC:定义一个游标使用数据的临时副本,对游标的所有请求都通过 tempdb 中的临时表得到应答,提取数据时对该游标不能反映基表数据修改的结果;静态游标不允许更改;
- DYNAMIC:表示当游标滚动时,动态游标反映对结果集内所有数据的更改;
- KEYSET:指定打开游标时,游标中记录顺序和成员身份已被固定,对进行唯一标识的键集内置在 tempdb 内一个称为 keyset
- 的表中;
- READ_ONLY|SCROLL_LOCKS|OPTIMISTIC:第一个参数表示游标为只读游标,SCROLL_LOCKS 表示在使游标的结果集时放置锁,当游标对数据进行读取时,数据库会对记录进行锁定,保证数据的一致性;OPTIMISTIC的作用在于通过游标读取数据,若读取数据之后被更改,那么通过游标定位进行的更新和删除操作不成功;
- select_statement:指定游标所用结果集的 SELECT 语句;
注意: 若 GROBAL 和 LOCAL
参数都未指定,默认值就由 default to local cursor 数据选项的设置控制;
例子1:声明名称为 cursor_B 的标准游标,如下所示:
declare cursor_B cursorfor select * from B
上述定义了一个名为 cursor_B 的游标,游标所操作的结果集从 SELECT 语句中得到;
例子2:声明名称为 cursor_B_read de 的只读游标,如下所示:
declare cursor_B_read cursor for select * from B for read only
上述代码中与标准的定义游标过程相比多出了 FOR READ ONLY 语句
,表名该游标的记录只能被读取,不能进行被读取,不能进行更改;
例子3:声明名称称为 curesor_B_update 的更改标签,如下所示:
declare cursor_B_update cursor for select * from B for update
2. 打开游标
使用 OPEN 语句
打开 Transa-SQL 服务器游标,执行 OPEN 语句
的过程,按照 SELECT 语句
填充数据,当打开游标时,游标的位置在数据集的第一行,打开游标的语法格式如下:
OPEN [GLOBAL] cursor_name | cursor_variable _name
例子1:打开游标 cursor_B,如下所示:
open cursor_B
打开游标后,可进行数据操作;
打开全局游标:
open global cursor_B
打开游标是对数据库进行一些 SQL SELECT 的操作,将耗费一段时间,取决于使用的系统性能和这条语句的复杂性;
3. 读取游标中的数据
打开游标后就能读取数据集中的记录,用 FETCH 语句
能对数据集总的数据进行某一行读取;
FETCH 语法的格式如下:
FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE {n | @nvar} | relative {n | @nvar} ] FROM ] {{ [ GLOBAL ] cursor_name } | @cursor_variable_name } { INTO @variable_name [,...n] }
- NEXT:返回结果集中当前行的下一行记录,若读取的是第一行记录,就返回第一行;NEXT 为默认的读取选项;
- PRIOR:返回结果集中当前行的一条记录,若当前行的第一条记录,就不返回,将游标定义到第一条记录;
- FIRST:返回结果集中的第一条记录,并把第一行作为当前行;
- LAST:返回结果集中的最后一条记录,并把最后一行作为当前行;
- ABSOLUTE n:若 n 为正数,就返回从游标末尾开始的 n 行,并返回作为新的当前行;若 n 为负值,就返回从游标 末尾开始的第 n 行,并返回行为作为新的当前行;若 n 为 0,就返回当前行;
- RELATIVE n:若 n 为正数,就返回从当前行开始的第 n 行;若 n 为负数,就返回当前行之前的第 n 行;若为 0,就返回当前行;
- GLOBAL:指定游标的作用域为全局游标;
- cursor_name:指定要打开游标的名称;
- INTO@variable_name[, ... n]:将记录中提取的字段信息存储到局部变量中;
例子 1:利用之前创建的游标 cursor_B_read 检索 B表中的记录
declare cursor_B_read cursor for select * from B open cursor_B_read fetch next from cursor_B_read while @@FETCH_STATUS = 0 begin fetch next from cursor_B_read end
在使用游标对数据进行读取时可声明一个游标变量,使用关键字 SET
对游标进行赋值;
对游标赋值的操作步骤:先创建一个游标,打开后将值赋予变量,最后通过 FETCH 语句
从变量中读取值;
例子 2:创建 cursor_S 游标,并将值赋予 @Mchr 游标变量
declare @Mchr cursor declare cursor_S cursor for select * from s; open cursor_S set @Mchr = cursor_S fetch next from @Mchr while @@FETCH_STATUS = 0 begin fetch next from @Mchr end close @Mchr deallocate @Mchr
先声明了游标变量 @Mchr,再创建一个 cursor_S 游标打开游标后将值赋给 @Mchr,最后用 FEECH 读取变量中的数据内容;
FETCH 语法
是游标使用的核心,使用游标能逐条记录到查询结果;已经声明并打开一个游标后,就能将数据放入任意的变量中;
在 FETCH 语句中,读者能指定游标的名称和目标的变量名称;
注意: 若在 SELECT 语句
中使用了 DISTINCT、UNION、GROUP BY 语句
,且在选择中包含了聚合表达式,游标就自动为 INSENSITIVE
的游标;
4. 关闭游标
SQL Server 数据库在创建一个游标后,数据库服务器会开辟一片存储空间用于存放游标返回的数据集;在游标使用完后一定要养成关闭游标的习惯,这样就能释放服务器为游标开辟的内存空间;
在处理完游标中的数据之后,用 CLOSE 命令能关闭一个已打开的游标;
语法格式如下:
CLOSE [ CLOBAL ] cursor_name | cursor_variable_naem
例子1:关闭名称为 cursor_B 的游标
close cursor_B
游标可应用在存储过程、触发器等中,若在声明游标上与释放游标之间使用了事务结构,在结束事务时游标就会自动关闭;
具体步骤如下:
- 声明一个游标;
- 打开游标;
- 读取游标;
BEGIN TRANSATION
;- 数据处理;
COMMIT TRANSATION
;
注意: 打开游标后,SQL Server 服务器会专门为游标开辟一定的内存空间用于存放游标操作的数据结果集,同时游标的使用也会根据具体情况对某些数据进行封锁;
所以在不使用游标时一定要关闭游标,以通知服务器释放游标所占用的资源;
关闭游标后,可再次打开游标,在一个批处理中,也能多次打开和关闭游标;
5. 释放游标
当用户确定某个游标不再使用时,应当即使使用 DEALLOCATE 命令释放游标,SQL Server 将删除这个游标的数据结构;
语法如下所示:
DEALLOCATE [GLOBAL]
游标被释放后据不能再使用 OPEN 命令
再次打开了;
关闭游标和释放游标的区别在于,关闭没有把游标运行所占用的内存空间释放,若再次打开游标,还能照常使用,若是释放,就是将游标占用的资源释放;若再想使用游标,就必须重新建立;
总结
到此这篇关于SQL Server数据库游标的基本操作指南的文章就介绍到这了,更多相关SQLServer游标基本操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!