游标是什么? 游标是对数据查询结果集的一种访问机制,用户通过游标可以对结果集进行逐条访问 游标访问的对象是 结果集,也可以称游标为定义在结果集上的指针,控制这个指针可以遍历结果集或特定的行
游标的作用 定位到结果集的某一行,对当前位置的数据进行读写 缺点:数据读取出来存放在TempDB里,会放到内存,一般来说内存空间有限,不可以太大,所以不适合数据量大的情况,适用于数据量小的情况
游标的分类? 游标分为:静态游标,动态游标,只进游标,键集驱动游标
- 静态游标:无论对数据库如何进行操作,结果集都不会变化;如果想让结果集和操作之后的数据保持一致,需要关闭游标,重新打开
- 动态游标:与静态游标相对,可以前后滚动,在滚动过程中,结果集获取所有的变化,利用游标提取数据时,行数据、顺序、成员都会发生变化,对数据库的操作都通过游标可见。api函数或T-SQL where current of子句通过游标进行更新;游标外部所作的更新直到提交时才可见
- 只进游标:不支持滚动,只能从头读到尾,对数据库的更新在提取时是可见的,提取后所作的修改不可见
只进游标:不支持滚动,提取后检测不到数据的变化,消耗的资源相对较少 —只读取数据 静态游标:在滚动时,检测不到表数据的变化,消耗的资源相对较少 —一般用静态游标 动态游标:在滚动时,检测表数据的变化,消耗的资源较多 —性能低
游标的生命周期 声明—打开—读取数据—关闭游标—释放游标
1.创建只进游标
--1定义游标
declare user_cursor cursor local --global 全局游标
for
--查询语句
select * from UserId,UserName,Age from UserInfos
where UserId>2
--2打开
open user_cursor
--@varUser 存放单行数据 UserId UserName
declare @varUser cursor,@uId int,@uName varchar(50),@uAge int
set @varUser = user_cursor
--3提取数据 next 向上 prior 向上 first 第一个 last 最后一个
--absolute n 绝对位置第n个 relative n 从当前位置开始第n个
fetch next from @varUser into @uId,@uName.@uAge --游标前进 into赋值
while @@FETCH_STATUS =0 --判断是否执行成功
begin
print cast(@uId as varchar) +','+@uName +','+convert(varchar,@uAge)
--验证只进游标不支持滚动,提取时对数据所作的更新是可见的,提取后对数据所作的修改是不可见的
if @uId=3
update UserInfos set Age=25 where UserId =27 --更新未提取的,更新可见
if @uId =27
update UserInfos set Age =29 where UserId =3 --更新已提取过的数据,更新不可见
fetch next from @varUser into @uId,@uName.@uAge
end
--4关闭游标
close user_cursor
--5释放游标
deallocate user_cursor
2.创建静态游标
--1.定义静态游标 静态游标的结果集不变,对数据库的更新不可见
declare user_cursor_static cursor static local --global 全局游标
for
--查询语句
select * from UserId,UserName,Age from UserInfos
where UserId>2
--2打开
open user_cursor_static
--@varUser 存放单行数据 UserId UserName
declare @varUser cursor,@uId int,@uName varchar(50),@uAge int
set @varUser = user_cursor_static
--3提取数据 next 向上 prior 向上 first 第一个 last 最后一个
--absolute n 绝对位置第n个 relative n 从当前位置开始第n个
fetch next from @varUser into @uId,@uName.@uAge --游标前进 into赋值
while @@FETCH_STATUS =0 --判断是否执行成功
begin
print cast(@uId as varchar) +','+@uName +','+convert(varchar,@uAge)
--验证只进游标不支持滚动,提取时对数据所作的更新是可见的,提取后对数据所作的修改是不可见的
if @uId=3
update UserInfos set Age=25 where UserId =27 --更新未提取的,更新可见
if @uId =27
update UserInfos set Age =29 where UserId =3 --更新已提取过的数据,更新不可见
fetch next from @varUser into @uId,@uName.@uAge
end
--4关闭游标
close user_cursor_static
--5释放游标
deallocate user_cursor_static
3.创建动态游标
--1.定义动态游标 动态游标的结果集是变化的,对数据库的更新是可见的
declare user_cursor_dynamic cursor dynamic local --global 全局游标
for
--查询语句
select * from UserId,UserName,Age from UserInfos
where UserId>2
--2打开
open user_cursor_dynamic
--@varUser 存放单行数据 UserId UserName
declare @varUser cursor,@uId int,@uName varchar(50),@uAge int
set @varUser = user_cursor_dynamic
--3提取数据 next 向上 prior 向上 first 第一个 last 最后一个
--absolute n 绝对位置第n个 relative n 从当前位置开始第n个
fetch next from @varUser into @uId,@uName.@uAge --游标前进 into赋值
while @@FETCH_STATUS =0 --判断是否执行成功
begin
print cast(@uId as varchar) +','+@uName +','+convert(varchar,@uAge)
--验证只进游标不支持滚动,提取时对数据所作的更新是可见的,提取后对数据所作的修改是不可见的
if @uId=3
update UserInfos set Age=25 where UserId =27 --更新未提取的,更新可见
if @uId =27
update UserInfos set Age =29 where UserId =3 --更新已提取过的数据,更新不可见
fetch next from @varUser into @uId,@uName.@uAge
end
--4关闭游标
close user_cursor_dynamic
--5释放游标
deallocate user_cursor_dynamic