游标介绍(附例题)

本文介绍了SQL游标的特性,包括返回结果集、定位特定行和修改当前行的能力。详细讲解了如何声明、打开、关闭和检索游标,并通过四个具体的例子展示了游标在数据操作中的应用,涉及工资和奖金的计算更新。每个例子都包含声明游标、执行更新操作和关闭游标的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.游标的特点

1)返回一个完整的结果集,但是允许程序设计语言只调用集合中的一行

2)定位在结果集的特定行

3)在结果集中对当前行进行修改

2. 声明游标

declare Grade_Cursor Cursor

For select * from grade

* declare 游标名 Cursor :只向前移动一下, NExt

* declare 游标名 Cursor Forward_only: 只支持Next

* declare 游标名 Cursor Scroll: 游标随意移动

3.打开游标

open Grade_Cursor

游标被打开后,游标指针位于结果集的第一行之前。

4.检索游标

Fetch next/prior/first/last(游标的方向) from 游标名

Fetch next from Grade_Cursor

逐行检索

while @@FETCH_STATUS=0

Begin

Fetch next from Grade_Cursor

end

全局变量

@@Fetch_Status: 0->成功完成Fetch语句

-1->Fetch语句有错,或当前游标指针已经到最后一行了

-2->提取的行不存在

@@rowcount: 返回目前已经从游标结果集中提取的行数

------------------------------------------------------------

例题:用到的表TblTeacher和TblTeacherSalary

游标介绍(附例题)

游标介绍(附例题)

----1将工资更新,更新后的金额为原来的工资+奖金。
declare @id int
declare @reward money
declare cur_Reward cursor fast_forward
for select tTId,reward from TblTeacherSalary

open cur_Reward
fetch next from cur_Reward into @id,@reward
while @@FETCH_STATUS=0
begin
update TblTeacher set tTSalary=tTSalary+@reward where tTId=@id
fetch next from cur_Reward into @id,@reward
end

close cur_Reward
deallocate cur_Reward

select * from TblTeacher
select * from TblTeacherSalary

---------------------------------------------------------------------------------
--2将奖金中的reward设置为工资的0.1倍
declare @sid int
declare @salary money
declare cur_reward2 cursor forward_only
for select tTId from TblTeacherSalary
open cur_reward2

fetch next from cur_reward2 into @sid
while @@FETCH_STATUS=0
begin
select @salary=tTSalary from TblTeacher where tTId=@sid
update TblTeacherSalary set reward=@salary*0.1 where current of cur_reward2
fetch next from cur_reward2 into @sid
end

close cur_reward2
deallocate cur_reward2

select * from TblTeacher
select * from TblTeacherSalary

--------------------------------------------------------------------------------
-- 3把游标写在对面的表上第一题:把游标写在TblTeacher.改TblTeacher;
declare @sid int
declare @salary money
declare cur_reward2 cursor forward_only
for select tTId from TblTeacherSalary

open cur_reward2
fetch next from cur_reward2 into @sid
while @@FETCH_STATUS=0
begin
--set @salary=(select tTSalary from TblTeacher)
select @salary=tTSalary from TblTeacher where tTId=@sid
update TblTeacherSalary set reward=@salary*0.1 where current of cur_reward2
fetch next from cur_reward2 into @sid
end
close cur_reward2
deallocate cur_reward2

select * from TblTeacher
select * from TblTeacherSalary

--第二题:改TblTeacherSalary,我们把游标写在techar上。

use TestSchool
select * from TblTeacher
select * from TblTeacherSalary

declare @id1 int
declare @salary money
declare cur_Reward1 cursor fast_forward
for select tTId,tTSalary from TblTeacher

open cur_Reward1
fetch next from cur_Reward1 into @id1,@salary
while @@FETCH_STATUS=0
begin
Update TblTeacherSalary set reward=@salary*0.1 where tTId=@id1
fetch next from cur_Reward1 into @id1,@salary
end

close cur_Reward1
deallocate cur_Reward1

-----------------------------------------------------------------------
-- 4把奖金表中的奖金更新为 reward-teacher.salary*0.05
update TblTeacherSalary set reward=reward-(select tTSalary*0.01 from TblTeacher where TblTeacher.tTId=TblTeacherSalary.tTId)

declare @id1 int
declare @salary money
declare cur_Reward1 cursor fast_forward
for select tTId,tTSalary from TblTeacher

open cur_Reward1
fetch next from cur_Reward1 into @id1,@salary
while @@FETCH_STATUS=0
begin
Update TblTeacherSalary set reward=@salary*0.05 where tTId=@id1
fetch next from cur_Reward1 into @id1,@salary
end

close cur_Reward1
deallocate cur_Reward1

select * from TblTeacher
select * from TblTeacherSalary

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值