当前位置:   article > 正文

SQL——游标_sql 游标

sql 游标

非原创---东拼西凑来的

游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。不像多数DBMS,MySQL游标只能用于存储过程(和函数)。

简单的说,游标(CURSOR)的特殊性在于它可以用循环对返回值进行逐条编译,它具有只读性、不可跳跃性和迟钝性。

游标会吃更多的内存,减少可用的并发。

游标5个组成部分

1、声明 2、打开 3、从游标中查找信息 4、关闭 5、释放

在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句:

  1. DECLARE 游标名 CURSOR
  2. FOR
  3. SELECT 语句 #此处必须是SELECT语句

一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来:

OPEN 游标名;

对于填有数据的游标,根据需要取出(检索)各行:

FETCH... FROM 游标名

FETCH指定检索什么数据,即所需的列,并指定检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行,以不重复读取同一行。

在结束游标使用时,必须关闭游标:

CLOSE 游标名;

在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。

游标创建

游标用DECLARE语句创建。DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句。

  1. CREATE PROCEDURE 储存过程名()
  2. BEGIN
  3. DECLARE 游标名 CURSOR
  4. FOR
  5. SELECT...
  6. FROM...
  7. WHERE...
  8. END

存储过程处理完成后,游标就“消失”了(因为它局限于存储过程之中)。

创建打开关闭游标举例

如前文所述,在定义游标之后,可以打开它:

  1. declare cursor1(游标名) cursor for select XXX--声明游标 1
  2. open XXXX--打开 2
  3. fetch next from XXX into XXX--将游标值赋给XXX 3
  4. while(@@fetch_status=0)--循环查找
  5. fetch next from XXX into XXX--同上
  6. close cursor1--关闭游标 4
  7. deallocate cursor1--解散游标 5
  8. fetch_status
  9. 0 FETCH 语句成功
  10. -1 FETCH 语句失败或此行不在结果集中
  11. -2 被提取的行不存在

CLOSE释放游标使用的所有内部内存和资源,因此在每个游标不再需要时都应该关闭。

在一个游标关闭后,如果没有重新打开,则不能使用它。但是,使用声明过的游标不需要再次声明,用OPEN语句打开它就可以了。

使用游标举例

在我们打开了游标后,如前文所述,可以用FETCH语句分别访问它的每一行:

  1. alter PROCEDURE cursor_a_b_insert
  2. @aId int,
  3. @aName nchar(10)
  4. AS
  5. declare @id int
  6. declare @name varchar(50)
  7. declare cursor1 cursor for --定义游标cursor1
  8. select bid,bname from b where aid=@aId --使用游标的对象(跟据需要填入select文)
  9. open cursor1 --打开游标
  10. fetch next from cursor1 into @id,@name --将游标向下移1行,获取的数据放入之前定义的变量@id,@name中
  11. while @@fetch_status=0 --判断是否成功获取数据
  12. begin
  13. update b set bname=@aName+'1' where bid=@id --进行相应处理(跟据需要填入SQL文)
  14. update a set aname=@aName where aid=@aId
  15. fetch next from cursor1 into @id,@name --将游标向下移1行
  16. end
  17. close cursor1 --关闭游标
  18. deallocate cursor1
  19. exec cursor_a_b_insert 55,'王媛媛'
  20. alter proc cursor_pr_UpUser
  21. @NoteUserId int
  22. as
  23. begin transaction
  24. declare @NLId int
  25. declare @NPLId int
  26. --创建用户所对应的日志游标cursorNLId,将日志id放入@NLId游标中
  27. declare cursorNLId cursor for select NoteLogId from NoteLogs where NUId=@NoteUserId
  28. open cursorNLId
  29. fetch next from cursorNLId into @NLId
  30. while @@fetch_status=0 --判断是否成功获取数据
  31. begin
  32. --创建日志所对应的评论游标cursorNPLId,将评论id放入@NPLId游标中
  33. declare cursorNPLId cursor for select NotePingLunId from NotePingLun where NLId=@NLId
  34. open cursorNPLId
  35. fetch next from cursorNPLId into @NPLId
  36. while @@fetch_status=0
  37. begin
  38. --根据评论游标@NPLId修改评论状态
  39. update dbo.NoteReply set NoteDel=0 where NoteReplyId=@NPLId
  40. fetch next from cursorNPLId into @NPLId
  41. end
  42. --当评论游标遍历完关闭
  43. close cursorNPLId --关闭游标
  44. deallocate cursorNPLId
  45. --根据日志游标@NPLId修改日志状态
  46. update dbo.NotePingLun set NoteDel=0 where NLId=@NLId
  47. fetch next from cursorNLId into @NLId
  48. end
  49. --关闭日志游标
  50. close cursorNLId --关闭游标
  51. deallocate cursorNLId
  52. --根据用户修改用户和日志状态
  53. update dbo.NoteUser set NoteDel=0 where NoteuserId=@NoteUserId
  54. update dbo.NoteLogs set NoteDel='qq' where NUId=@NoteUserId
  55. if @@error<>0 --如果有错误
  56. begin
  57. print '删除失败,回滚事务'
  58. rollback transaction --回滚
  59. end
  60. else
  61. begin
  62. print '删除成功,提交事务'
  63. commit transaction
  64. end
  65. go
  66. exec cursor_pr_UpUser 1

其中FETCH语句自动从第一行开始检索当前行的order_num列,并存储到一个名为“乖巧的局部变量”的局部声明的变量中。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/619425
推荐阅读
相关标签
  

闽ICP备14008679号