数据库 “游标”——对数据库查询的结果集再查询

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值