1. 什么是“游标”
游标 是SQL的一种数据访问机制。
SQL的select的查询操作结果返回的是一个包括一行或者多行的数据集,当我们想要在查询的结果集上查询(查看第一行,第二行,下一行,最后一行,最后十行等)时,简单的select操作是行不通的。这时候就需要“游标”了。
可以认为,游标是结果集的指针。
游标是只读的,不能更新它。
游标是不能滚动的,只能在一个方向上进行遍历,不能在记录之间随意进退,不能跳过某些记录。
应该避免在打开游标的表上更新数据。
2. 使用游标的步骤
声明游标——>打开游标——>读取数据——>关闭游标——>删除游标
3. 声明游标
declare cursorName Cursor 特性
for
select ……
特性:
[ LOCAL | GLOBAL] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ]
(具体代表什么还不知道)
4. 打开游标
Open Cursorname
5. 读取数据
Fetch [next | prior | first | last | absolute{n|@navr} | relative{n|@nvar} ] from Cursorname
- next :递增
- prior :递减
- first : 第一行
- last : 最后一行
- absolute{n | @nvar} : 当 n 或 @nvar 为正,则返回从游标头开始向后n行的第n行,并将返回行作为当前行;为负,则返回从游标末尾开始向前的n行的第n行,并将返回行变成新的当前行;为0则不返回行。
- RELATIVE { n | @nvar } : 如果n或@nvar为正,则返回从当前行开始向后的第n行。如果n或@nvar为负,则返回从当前行开始向前的第n行。如果n或@nvar为0,则返回当前行
6. 关闭游标
close CursorName
7. 删除游标
deallocate CursorName
8. 实例
--创建存储过程
create procedure text_cursor
as
delare @id int
delare @name char(20)
--1. 声明游标
declare mycursor cursor scroll
for
select * from stu where school='水木大学'
--2. 打开游标
open mycursor
--3. 获取数据
fetch next from mycursor --读取下一行,并将它设置为当前行。
fetch prior from mycursor --读取前一行,并将它设置为当前行。
fetch first | last from mycursor
fetch absolute 3 from mycursor --读取从游标头开始的向下第3行,并将它设置为当前行
fetch relative -3 from mycursor --读取从当前行向上的第3行,并将它设置为当前行
fetch next from mycursor into @id,@name
while(@@fetch_state =0)
begin
print'游标成功取出一条数据:'
print @id
print @name
print '.................'
fetch next from mycursor into @id,@name
end
--4. 关闭游标
close mycursor
--5.删除游标
deallocate mycursor
9. 实例2
USE AdventureWorks2022;
GO
-- Declare and open a keyset-driven cursor.
DECLARE abc CURSOR KEYSET FOR
SELECT LastName
FROM Person.Person
WHERE LastName LIKE 'S%';
OPEN abc;
-- Declare a cursor variable to hold the cursor output variable
-- from sp_cursor_list.
DECLARE @Report CURSOR;
-- Execute sp_cursor_list into the cursor variable.
--显示在当前作用域内的游标及其属性
EXEC master.dbo.sp_cursor_list @cursor_return = @Report OUTPUT,
@cursor_scope = 2;
-- Fetch all the rows from the sp_cursor_list output cursor.
FETCH NEXT from @Report;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
FETCH NEXT from @Report;
END
-- Close and deallocate the cursor from sp_cursor_list.
CLOSE @Report;
DEALLOCATE @Report;
GO
-- Close and deallocate the original cursor.
CLOSE abc;
DEALLOCATE abc;
GO