SQL Server中的游标

游标的概念

        游标是一种能从包含多个元组的集合中每次读取一个元组的机制。游标总是和一段SELECT语句关联,SELECT语句查询出的结果集就作为集合,游标能每次从该集合中读取出一个元组进行不同操作。
游标的作用

    将游标定位在结果集特定元组。
    将游标指定结果集中的元组数据读出。
    利用循环读取结果集中的多个元组数据。
    对游标指定结果集的元组进行数据修改。
    为其它用户设置结果集数据的更新限制。
    提供脚本、存储过程和触发器中访问结果集中数据的TSQL语句。

SQL SERVER游标类型支持TSQL游标、API游标和客户游标。
游标的管理
声明游标

DECLARE cursor_name CURSOR [INSENSITIVE] [SCROLL] CURSOR
    FOR <SELECT语句>
[FOR READ ONLY|UPDATE[OF <列名>[,...n]]]

INSENSITIVE:定义游标所选出的结果集存放在一个临时表,对该游标的读取操作都有该临时表来应答。游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该关键字,对基本表的更新、删除都会反应到游标中。


SCROLL:指定游标使用的读取选项,默认值为NEXT,如果不使用该关键字,那么读取游标只能进行NEXT操作,如果使用该关键字,那么游标向任何方向,或者任何位置移动,进行NEXT、LAST、FIRST、PRIOR、RELATIVE n、ABSULUTE n操作。


FOR READ ONLY:表示定义游标为只读游标,不允许使用UPDATE、DELETE语句更新游标内的数据。


UPDATE[OF <类名>[,...n]]:指定游标内可以更新的列,如果有指定要更新的列,则表明所有列都允许更新。

打开游标

游标在声明以后需要打开后,才能使用。

OPEN [LOCAL|GLOBAL] cursor_name;

LOCAL|GLOBAL:指定游标为局部或全局游标。

读取游标

FETCH [NEXT|PRIOR|FIRST|LAST
        |ABSLUTE n|@nvar]
        |RELATIVE n|@nvar]
FROM [GLOBAL]cursor_name
INTO[@nvar1,...n]


 关闭游标

在处理完结果集中数据之后,必须关闭游标来释放结果集

CLOSE [GLOBAL] cursor_name

释放游标

游标使用不再需要之后,需要释放游标,以获取与游标有关的一切资源。

DEALLOCATE [GLOBAL] cursor_name

游标系统变量与函数

游标系统变量与函数返回有关游标的信息。

  • @@CURSOR_NUM

返回最后打开的游标中满足条件的元组数。

  • @@FETCH_STATUS

返回上次执行FETCH命令的状态。

  • CURSOR_STATUS('GLOBAL|LOCAL','cursor_name')

 用于确定是否返回游标和结果集。

利用游标修改和删除表数据

可以通过游标来UPDATE修改或删除DELETE表中的当前数据行。

--修改数据
UPDATE table_name
    SET column_name=value|expression
    WHERE CURRENT OF cursor_name
--删除数据
DELETE FROM table_name
    WHERE CURRENT OF cursor_name

 举例

有一张学生信息表S表。

1. 声明一个标准的游标,并使用它

USE SCHOOL;
GO
DECLARE normal_cursor CURSOR --声明游标
	FOR SELECT TOP 10 SNAME FROM S;
OPEN normal_cursor;--打开游标
DECLARE @var_name VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH NEXT FROM normal_cursor INTO @var_name;--通过FETCH操作抓取数据存储到变量中
PRINT @var_name --打印FETCH得到的元组
GO
CLOSE normal_cursor;

 2.试使用该游标读取结果集最后一行的元组。

OPEN normal_cursor;--打开游标
DECLARE @var_name VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH LAST FROM normal_cursor INTO @var_name;--通过FETCH操作抓取数据存储到变量中
PRINT @var_name --打印FETCH得到的元组
GO
CLOSE normal_cursor;

 出现ERROR,因为在DECLARE CUROSR时,我们没有声明SCROLL关键字,则默认值为NEXT,那么在对该游标进行FETCH操作时,只能进行NEXT操作。

DECLARE scroll_cursor1 SCROLL CURSOR --声明游标
	FOR SELECT TOP 10 SNAME FROM S;
OPEN scroll_cursor1;--打开游标
DECLARE @var_name1 VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH LAST FROM scroll_cursor1 INTO @var_name1;--通过FETCH操作抓取数据存储到变量中
PRINT @var_name1 --打印FETCH得到的元组
GO
CLOSE scroll_cursor1;

  成功读取到结果集最后一行元组,声明SCROLL关键字以后,FETCH还可以进行NEXT、LAST、FIRST、RELATIVE等操作。

OPEN scroll_cursor1;--打开游标
DECLARE @var_name1 VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH LAST FROM scroll_cursor1 INTO @var_name1;--通过FETCH操作抓取数据存储到变量中
SELECT @var_name1 AS '最后一行数据'--打印FETCH得到的元组
SELECT @@CURSOR_ROWS AS '当前游标元组数',@@FETCH_STATUS AS '上次FETCH操作状态',
		CURSOR_STATUS('GLOBAL','scroll_cursor1') AS '游标状态'
GO
CLOSE scroll_cursor1;

 下面利用WHILE循环打印出游标中的结果集。

OPEN scroll_cursor1;--打开游标
DECLARE @var_name1 VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH NEXT FROM scroll_cursor1 INTO @var_name1;--通过FETCH操作抓取数据存储到变量中
WHILE(@@FETCH_STATUS=0)--判断是否读取到最后一行
	BEGIN
		PRINT @var_name1;
		FETCH NEXT FROM scroll_cursor1 INTO @var_name1;--将下一行新值覆盖变量原来的值
	END
GO
CLOSE scroll_cursor1;


————————————————
版权声明:本文为CSDN博主「dogplays」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44540985/article/details/121393720

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值