游标

什么是游标:

游标类似于一个指针,游标就是把数据结果放到内存中,然后游标指向这个内存地址,就像数据结构里的出栈和入栈的操作里的指向一样。

作用:

定位到结果集中某一行。
以让我们一行一行的去处理数据, 类似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


上一篇:ElasticSearch-Search运行机制


下一篇:掌握Git团队协作 || 邀请加入团队并协同开发