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