关于存储过程游标的使用 返回

想请教下,fetch next 之后的命令还会执行么?
比如
DECLARE mycur CURSOR local fast_forward FOR SELECT id FROM [hello] OPEN mycur FETCH next FROM mycur INTO @id while @@FETCH_STATUS=0 begin xxxxx fetch next from mycur into @id yyyy end
其中 xxxx 和 yyyy都是各种命令
我的问题是 这个代码中的 yyyy 还会执行么 ?
热忱回答(7)
-
fate sta VIP0
2023/6/4当 FETCH NEXT 语句执行后,如果 @@FETCH_STATUS 的值为0,表示在游标中还有数据行,那么 while 循环中的语句块会被执行,包括 xxxx 和 yyyy 语句。执行完毕后,再次执行 FETCH NEXT 语句,继续循环。直到 @@FETCH_STATUS 的值为-1,表示游标中没有更多的数据行,循环结束。所以,在这个代码中,yyyy 语句会执行,直到游标中没有更多数据行。
0 回复 -
lizhb VIP0
2023/6/4@fate sta:感谢,你的意思是说 XXXX和YYYY之间的fetch next from mycur into @id 执行后,如果 @@FETCH_STATUS 值还是0,会继续执行YYYY指令,而不会跳过YYYY进入下一个循环?
我这边是有个别人写的存储过程,有个if判断,大概是
while @@fetch_status=0 begin if m=n begin fetch next from mycur into @id end if m=x .... else if m=y .... else if m=n ..... else .... fetch next from mycur into @id end
我这边的疑惑是
if m=n begin fetch next from mycur into @id end
这个满足条件的时候,会fetch next,然后还会继续执行 if m=x 这些判断么?,习惯了sqlsugar,但是公司的系统靠存储过程搞逻辑,只能开始解除这玩意。不知道这个fetch是否跳过之后指令直接进入下一个fetch_status判断,还是会继续执行完后续指令再判断fetch_status
0 回复 -
lizhb VIP0
2023/6/4如果上面这个
if m=n begin fetch next from mycur into @id end
执行完后还会继续下面的判断,那下面这些判断中引用到的 @id 值是 fetch next之前的旧值,还是之后的新值
0 回复 -
fate sta VIP0
2023/6/4在给定的代码中,当 m=n 时,将执行
fetch next from mycur into @id
,然后继续执行下面的判断语句。在这种情况下,@id
的值将是fetch next
之前的旧值。原因是,
fetch next
语句在执行之前不会更新变量的值,它只会在执行后更新。因此,在fetch next
语句执行之前,@id
的值将保持不变。如果您希望在判断语句中使用fetch next
之后的新值,您需要将判断语句放在fetch next
语句的后面。0 回复 -
lizhb VIP0
2023/6/4@fate sta:感谢,像我提供的这个代码,除了 m=n 情况下 会执行fetch next from mycur into @id 外
在后面的判断语句执行完之后,还会再执行一次 fetch next from mycur into @id
这种情况下,游标是跳了1次还是2次?
感谢哈
0 回复 -
fate sta VIP0
2023/6/5在上述代码中,在 m=n 的情况下,会执行 fetch next from mycur into @id 语句。然后,在后面的判断语句执行完之后,又会执行一次 fetch next from mycur into @id。
因此,在 m=n 的情况下,游标会跳过1次,然后在后面的判断语句执行完后,又跳过1次,总共跳过了2次。
0 回复 -
lizhb VIP0
2023/6/5@fate sta:假设本次进入的是第1行,那就是下次进入循环体,实际上数据已经是第三行了
0 回复