定位到结果集中某一行
游标分类
- 静态游标(Static):在操作游标的时候,数据发生变化,游标中数据不变。
- 动态游标(Dynamic):在操作游标的时候,数据发生变化,游标中数据改变,默认值。
- 键集驱动游标(Keyset):在操作游标的时候,被标识的列发生改变,游标中数据改变;其它列改变,游标中数据不变。
Member 表:
MemberId | MemberAccount | MemberPwd | MemberNickname | MemberPhone |
---|---|---|---|---|
1 | liubei | 123456 | 刘备 | 789877 |
2 | guanyu | 123456 | 关羽 | 789876 |
3 | zhangfei | 123456 | 张飞 | 789875 |
4 | zhaoyun | 123456 | 赵云 | 789871 |
5 | machao | 123456 | 马超 | 789872 |
创建指向单列的游标
declare mycur cursor scroll -- 创建游标 mycru
for select MemberAccount from Member -- 指向单列,游标在 MemberAccount 列进行移动
- scroll:滚动游标。如果没有 scroll,游标只能向下移动,有scroll 游标既可以向下也可以向上移动。
创建指向多列的游标
declare mycurs cursor scroll
for select MemberAccount,MemberPwd,MemberNickname from Member
打开游标
open mycur
提取某行数据
fectch first from mycur -- 提取第一行,输出 liubei
fectch last from mycur -- 提取最后一行,输出 machao
fectch absolute 2 from mycur -- 提取绝对第二行,输出 guanyu
fecth relative 2 from mycur -- 提取相对第二行,即当前行下移2行,输出 zhaoyun
fectch next from mycur -- 下移一行,输出 machao
fectch prior from mycur --上移一行, 输出 zhaoyun
提取游标数据存入变量,进行查询所有列信息
deacler @acc varchar(20) -- 声明变量 @acc
fecth absolute 2 from mycur into @acc -- 提取 guanyu 存入变量 @acc
select * from Member where MemberAccount = @cc -- 查询 @acc 所在记录
遍历游标
deacler @acc varchar(20)
-- deacler @abb varchar(20),多列的话声明多个变量
-- deacler @abb varchar(20)
fecth absolute 1 from mycur into @acc -- 将游标第一行存入变量 @acc,
-- 如果是多列,则 fecth absolute 1 from mycur into @acc,@abb,@acc,下同
while @@fecth_status = 0
begin
print '提取成功:' + @acc
fectch next from mycur into @acc
end
-- 输出结果:
提取成功:liubei
提取成功:guanyu
提取成功:zhangfei
提取成功:zhaoyun
提取成功:machao
- @@fetch_status:0,提取成功;-1,失败;-2:不存在;
利用游标进行数据的修改和删除
fetch absolute 2 from mycur -- 将游标定位到第二行,guanyu
update Member set MemberPwd = '222' where current of mycur -- 修改第二行 MemberPwd 列为 222
delete from Member where current of mycur -- 删除第二行
- current of mycur:当前游标所在位置
关闭游标
close mycur
删除游标
deallocate mycur