什么叫游标(CURSOR)
一个游标(cursor)可以被看作指向结果集(a set of rows)中一行的指针(pointer)。
游标每个时间点只能指向一行,但是可以根据需要指向结果集中其他的行。
例如:SELECT * FROM employees WHERE sex=’M’会返回所有性别为男的雇员,在初始的时候,游标被放置在结果集中第一行的前面。
使游标指向第一行,要执行FETCH。当游标指向结果集中一行的时候,可以对这行数据进行加工处理,要想得到下一行数据,要继续执行FETCH。FETCH操作可以重复执行,直到完成结果集中的所有行。
什么时候使用游标?
简单的回答是需要对选出的结果集,进行遍历的时候,需要考虑使用游标。
当需要在存储过程中遍历所查得的结果集时用游标
1。在存储过程中,使游标,可以根据每条记录的某个字段的取值的不同,来采取相应的处理。这就是流程控制。
2. 游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。
游标的使用方法
declare @ID int
declare @Oid int
declare @Login varchar(50)
--定义一个游标
declare user_cur cursor for select ID,Oid,[Login] from ST_User
--打开游标
open user_cur
while @@fetch_status=0 请输入代码
begin
--读取游标
fetch next from user_cur into @ID,@Oid,@Login
print @ID
--print @Login
end
close user_cur
--摧毁游标
deallocate user_cur
例子
创建一个存储过程使用游标 如果该职工入职时间超过3年 并且学历 在本科以上 则对该职工工资加10%如果 学历没达到本科的 入职时间在10年以上 同样对该职工工资追加8% 其他的一律不加
REATE proc jiagongzi
as
declare @name nvarchar(20)
declare @xueli nvarchar(20)
declare @time datetime
declare @gongzi intdeclare zengjia cursor scroll
for
select * from 职员表
open zengjia
fetch next from zengjia into @name,@xueli,@time,@gongzi
while @@FETCH_STATUS=0
begin
if (@xueli='本科' or @xueli='硕士') and DATEDIFF(year, @time, getdate())>=3
begin
update 职员表 set 工资=@gongzi+@gongzi*0.1 where 姓名=@name
end
if (@xueli<>'本科' and @xueli<>'硕士') and DATEDIFF(year, @time, getdate())>=10
begin
update 职员表 set 工资=@gongzi+@gongzi*0.08 where 姓名=@name
end
fetch next from zengjia into @name,@xueli,@time,@gongzi
end
close zengjia
deallocate zengjia goexec jiagongzi