什么是游标:
游标类似于一个指针,游标就是把数据结果放到内存中,然后游标指向这个内存地址,就像数据结构里的出栈和入栈的操作里的指向一样。
作用:
定位到结果集中某一行。
以让我们一行一行的去处理数据, 类似c# ado.net SqlDataReader 可以提供一行一行的读取数据
游标分类:
1)静态游标(Static):在操作游标的时候,数据发生变化,游标中数据不变
2)动态游标(Dynamic):在操作游标的时候,数据发生变化,游标中数据改变
3)键集驱动游标(KeySet):在操作游标的时候,被标识的列发生改变,游标中数据改变,其他列改变,游标中数据不变
使用游标的步骤:
1:创建游标 declare 游标名字 cursor for ....接语句
2:打开游标 open 游标名字
3:查询游标(可以是遍历) fetch next from 游标名称 into 变量
4:关闭游标 close 游标名字
5:删除(释放)游标 deallocate 游标名字
@@fetch_status:查询游标有没有读完,如果是-1就说明游标读完了,
注意:游标打开的初始@@fetch_status也是等于-1,没有读取的时候是-1,读取完了也是-1,等于0表示提取成功
基本使用:
定义一个动态游标,
--1.创建游标(Scroll代表滚动游标,不加Scroll则是只进的,只能支持fetch next)
declare CURSORMember cursor scroll --CURSORMember :游标名字
for select MemberAccount from Member --查一行的某个字段给游标
--2.打开游标
open CURSORMember
--3.提取数据
fetch first from CURSORMember --结果集的第一行
fetch last from CURSORMember --最后一行
fetch absolute n from CURSORMember --从游标的第一行开始数,第n行,会让游标停留在第n行,用于定位游标
fetch relative 3 from CURSORMember --从当前位置数,第n行。
fetch next from CURSORMember --当前位置的下一行
fetch prior from CURSORMember --当前位置的上一行
--4.提取数据给变量以供它用(取出第3行用户名,查询该用户详细信息)
--declare @MemberAccount varchar(30)
--fetch absolute 3 from CURSORMember into @MemberAccount
--select * from Member where MemberAccount = @MemberAccount
--5.利用游标提取所有的账户信息
--方案一:
fetch absolute 1 from CURSORMember
while @@FETCH_STATUS = 0 --@@FETCH_STATUS=0,提取成功,-1提取失败,-2行不存在
begin
fetch next from CURSORMember --当前位置的下一行
end
--方案二:
declare @MemberAccount varchar(30)
fetch absolute 1 from CURSORMember into @MemberAccount --将游标指向第一行
while @@FETCH_STATUS = 0 --@@FETCH_STATUS=0,提取成功,-1提取失败,-2行不存在
begin
print '提取成功:' + @MemberAccount
fetch next from CURSORMember into @MemberAccount
end
--6.利用游标修改和删除数据
fetch absolute 3 from CURSORMember
update Member set MemberPwd = '1234567' where Current of CURSORMember --条件直接写游标名字就好了,因为游标当前就指向这行数据
fetch absolute 3 from CURSORMember
delete Member where Current of CURSORMember
select * from Member
--7.关闭游标
close CURSORMember
--8.删除游标
deallocate CURSORMember
--9.创建游标指向某行多列数据,并循环显示数据
declare CURSORMember cursor scroll
for select MemberAccount,MemberPwd,MemberNickname,MemberPhone from Member
open CURSORMember
declare @MemberAccount varchar(30)
declare @MemberPwd nvarchar(20)
declare @MemberNickname nvarchar(20)
declare @MemberPhone nvarchar(20)
fetch next from CURSORMember into @MemberAccount,@MemberPwd,@MemberNickname,@MemberPhone
while @@FETCH_STATUS = 0 --@@FETCH_STATUS=0,提取成功,-1提取失败,-2行不存在
begin
print '提取成功:' + @MemberAccount+','+@MemberPwd+','+@MemberNickname+','+@MemberPhone
fetch next from CURSORMember into @MemberAccount,@MemberPwd,@MemberNickname,@MemberPhone
end
close CURSORMember