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

Sql论坛 老数据
7 2049
该叫什么 lizhb 发布于2023/6/4
悬赏:0 飞吻

想请教下,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

  • 当 FETCH NEXT 语句执行后,如果 @@FETCH_STATUS 的值为0,表示在游标中还有数据行,那么 while 循环中的语句块会被执行,包括 xxxx 和 yyyy 语句。执行完毕后,再次执行 FETCH NEXT 语句,继续循环。直到 @@FETCH_STATUS 的值为-1,表示游标中没有更多的数据行,循环结束。所以,在这个代码中,yyyy 语句会执行,直到游标中没有更多数据行。


    0 回复
  • lizhb 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 lizhb VIP0
    2023/6/4

    如果上面这个

    if m=n
        begin
           fetch next from mycur into @id
        end

    执行完后还会继续下面的判断,那下面这些判断中引用到的 @id 值是 fetch next之前的旧值,还是之后的新值

    0 回复
  • 在给定的代码中,当 m=n 时,将执行 fetch next from mycur into @id,然后继续执行下面的判断语句。在这种情况下,@id 的值将是 fetch next 之前的旧值。

    原因是,fetch next 语句在执行之前不会更新变量的值,它只会在执行后更新。因此,在 fetch next 语句执行之前,@id 的值将保持不变。如果您希望在判断语句中使用 fetch next 之后的新值,您需要将判断语句放在 fetch next 语句的后面。


    0 回复
  • lizhb lizhb VIP0
    2023/6/4

    @fate sta:感谢,像我提供的这个代码,除了 m=n 情况下 会执行fetch next from mycur into @id 外

    在后面的判断语句执行完之后,还会再执行一次 fetch next from mycur into @id

    这种情况下,游标是跳了1次还是2次?

    感谢哈

    0 回复
  • 在上述代码中,在 m=n 的情况下,会执行 fetch next from mycur into @id 语句。然后,在后面的判断语句执行完之后,又会执行一次 fetch next from mycur into @id。


    因此,在 m=n 的情况下,游标会跳过1次,然后在后面的判断语句执行完后,又跳过1次,总共跳过了2次。


    0 回复
  • lizhb lizhb VIP0
    2023/6/5

    @fate sta:假设本次进入的是第1行,那就是下次进入循环体,实际上数据已经是第三行了

    0 回复