1. 苏葳的备忘录首页
  2. 数据库

Sybase中fetch语句里如何更新当前行

sybase 游标 fetch游标是一个在数据库中十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 查询语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。fetch语句可以检索结果集中某条记录,下面是在Sybase中游标更新当前行时的问题记录。

drop proc testzzzzz
go
create proc testzzzzz
as
begin
declare @bbb int,@kk char(20)
declare @zzz char(13)
declare @kkk char(20)
select @bbb=1
declare cur_bt cursor for select rcdat1 from zzztest where code="00000006" for update of rcdat1,rcdat3
open cur_bt
fetch cur_bt  into @kk
while @@sqlstatus = 0
begin
  select @zzz="0001-"+replicate("0",8-char_length(convert(varchar,@bbb)))+convert(varchar,@bbb)
  select @kkk="测试人"+convert(varchar,@bbb)
  update zzztest set rcdat1=@zzz,rcdat3=@kkk where current of cur_bt
  select @bbb=@bbb+ convert(int,FLOOR(1 + (RAND() * 6)))
  fetch cur_bt into @kk
end
close cur_bt
deallocate cursor cur_bt
end

首先:要更新的表中需有唯一索引或主键

其次:Declare cursor中的sql语句不可加group by having 或order by之类语句,不然会变为只读游标,在for update时会报错。

顺便赠送:convert(int,FLOOR(0 + (RAND() * 6))) 是一个生成0-6随机整数的函数。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/259.html

发表评论

邮箱地址不会被公开。 必填项已用*标注