游标是一种能从包含多个元组的集合中每次读取一个元组的机制。游标总是和一段SELECT语句关联,SELECT语句查询出的结果集就作为集合,游标能每次从该集合中读取出一个元组进行不同操作。
SQL SERVER游标类型支持TSQL游标、API游标和客户游标。
DECLARE cursor_name CURSOR [INSENSITIVE] [SCROLL] CURSOR
FOR
游标在声明以后需要打开后,才能使用。
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]
名称 | 含义 |
---|---|
FIRST | 读取游标中第一行数据 |
LAST | 读取游标最后一行数据 |
NEXT | 读取游标当前行下一行数据 |
PRIOR | 读取游标当前行上一行数据 |
RELATIVE n | 读取游标当前行之前或之后第n行数据(n为正则向前,反之则向后) |
ABSULUTE n | 读取游标第n行数据(n为负从最后一行开始,反之则从第一行开始) |
在处理完结果集中数据之后,必须关闭游标来释放结果集
CLOSE [GLOBAL] cursor_name
游标使用不再需要之后,需要释放游标,以获取与游标有关的一切资源。
DEALLOCATE [GLOBAL] cursor_name
游标系统变量与函数返回有关游标的信息。
返回最后打开的游标中满足条件的元组数。
返回上次执行FETCH命令的状态。
返回值 | 说明 |
---|---|
0 | FETCH语句成功 |
-1 | FETCH语句失败或此元组不在结果集中 |
-2 | 被读取的元组不存在 |
返回值 | 意义 |
---|---|
1 | 结果集至少一行 |
0 | 结果集为空 |
-1 | 游标被关闭 |
-2 | 游标不可用 |
-3 | 指定游标不存在 |
用于确定是否返回游标和结果集。
可以通过游标来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;
写此篇博客意为记录分享学习技术上所学内容,作者能力有限,如有不足之处还请斧正。