游标
基本操作
- 申明游标
- 打开游标
- 读取游标中的数据
- 关闭游标
- 释放游标
申明游标
【例1】声明名称为cursor_author的游标
DECLARE cursor_author CURSOR FOR SELECT auth_name,auth_phone FROM authors
打开游标
【例2】打开上例中声明的名称为cursor_author的游标
OPEN cursor_author
读取游标中的数据
【例3】使用名称为cursor_author的光标,检索authors表中的记录
FETCH NEXT FROM cursor_author WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_author END
关闭游标
【例4】关闭名称为cursor_author的游标
CLOSE cursor_author
释放游标
【例5】使用DEALLOCATE语句释放名称为cursor_fruit的变量
DEALLOCATE cursor_author
游标的运用
使用游标变量
【例6】声明名称为@VarCursor的游标变量
DECLARE @VarCursor CURSOR --声明游标变量 DECLARE cursor_author CURSOR FOR --创建游标 SELECT auth_name,auth_phone FROM authors OPEN cursor_author --打开游标 SET @VarCursor = cursor_author --为游标变量赋值 FETCH NEXT FROM @VarCursor --从游标变量中读取值 WHILE @@FETCH_STATUS = 0 --判断FETCH语句是否执行成功 BEGIN FETCH NEXT FROM @VarCursor --读取游标变量中的数据 END CLOSE @VarCursor --关闭游标 DEALLOCATE @VarCursor --释放游标
用游标为变量赋值
在游标的操作过程中,可以使用FETCH语句将数据值存入变量,这些保持表中列值的变量可以在后面的程序中使用。
【例17】创建游标cursor_variable,将fruits表中记录的f_name,f_price值赋给变量@fruitName和@fruitPrice,并打印输出
DECLARE @AuthorName VARCHAR(20),@AuthorPhone VARCHAR(20) DECLARE cursor_variable CURSOR FOR SELECT auth_name,auth_phone FROM authors WHERE auth_id = 1; OPEN cursor_variable FETCH NEXT FROM cursor_variable INTO @AuthorName,@AuthorPhone PRINT '姓名:'+'电话:' WHILE @@FETCH_STATUS = 0 BEGIN PRINT @AuthorName + ''+@AuthorPhone FETCH NEXT FROM cursor_variable INTO @AuthorName,@AuthorPhone END CLOSE cursor_variable DEALLOCATE cursor_variable
用ORDER BY子句改变游标中行的顺序
游标是一个查询结果集,将ORDER BY子句添加到查询中可以对游标查询结果排序。
【例8】声明名称为cursor_author的游标,对authors表中的记录按照价格字段降序排列
DECLARE cursor_author CURSOR FOR SELECT auth_id,auth_name,auth_age FROM authors ORDER BY auth_age DESC OPEN cursor_author FETCH NEXT FROM cursor_author WHILE @@FETCH_STATUS = 0 FETCH NEXT FROM cursor_author CLOSE cursor_author DEALLOCATE cursor_author
用游标修改数据
【例9】声明整型变量@ID=7,然后声明一个对authors表进行操作的游标,打开该游标,使用FETCH NEXT方法来获取游标中的每一行的数据,如果获取到的记录的id字段值与@ID值相同,将记录中的auth_phone字段修改,最后关闭并释放游标
DECLARE @sID INT DECLARE @ID INT = 7 DECLARE cursor_author CURSOR FOR SELECT auth_id FROM authors OPEN cursor_author FETCH NEXT FROM cursor_author INTO @sID WHILE @@FETCH_STATUS = 0 BEGIN IF @sID = @ID BEGIN UPDATE authors SET auth_phone = 100 WHERE auth_id = @ID END FETCH NEXT FROM cursor_author INTO @sID END CLOSE cursor_author DEALLOCATE cursor_author SELECT * FROM authors WHERE auth_id = 7
用游标删除数据
【例10】使用游标删除表中id=7的记录
DECLARE @sID INT DECLARE @ID INT = 7 DECLARE cursor_delete CURSOR FOR SELECT auth_id FROM authors OPEN cursor_delete FETCH NEXT FROM cursor_delete INTO @sID WHILE @@FETCH_STATUS = 0 BEGIN IF @sID = @ID BEGIN DELETE FROM authors WHERE auth_id = @ID END FETCH NEXT FROM cursor_delete INTO @sID END CLOSE cursor_delete DEALLOCATE cursor_delete
使用系统存储过程管理游标
使用系统存储过程sp_sursor_list、sp_describe_cursor、sp_describe_cursor_columns、sp_describe_cursor_table可以分别查看当前为连接打开的服务器游标属性、服务器游标属性、游标结果集中列的属性、被引用对象或基本表的属性。
sp_sursor_list存储过程
报告当前为连接打开的服务器游标的属性。
【例11】打开一个全局游标,并使用sp_cursor_list报告该游标的属性
-- 申明游标 DECLARE cursor_author CURSOR FOR SELECT auth_name FROM authors WHERE auth_name LIKE '%飞' -- 打开游标 OPEN cursor_author -- 申明游标变量 DECLARE @Report CURSOR -- 执行sp_cursor_list存储过程,将结果保存到@Report游标变量中 EXEC sp_cursor_list @cursor_return = @Report OUTPUT,@cursor_scope = 2 -- 输出游标变量中的每一行 FETCH NEXT FROM @Report WHILE (@@FETCH_STATUS <> -1) BEGIN FETCH NEXT FROM @Report END --关闭并释放游标变量 CLOSE @Report DEALLOCATE @Report --关闭并释放原始游标 CLOSE cursor_author DEALLOCATE cursor_author
问题
- 游标变量可以为游标变量赋值吗?
当然可以,游标可以赋值为游标变量,也可以将一个游标变量赋值给另一个游标变量,例如SET @cursorVal1 = @cursorVal12。
- 游标用完后如何处理?
当然是要关闭和删除,关闭游标的作用是释放游标和数据库的连接,删除游标是将其从内存中删除,释放系统资源。
本文来自博客园,作者:一纸年华,转载请注明原文链接:https://www.cnblogs.com/nullcodeworld/p/18210656
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)