Oracle儲存過程中跳出迴圈的寫法

風靈使發表於2018-09-24

記錄exitreturn的用法

1:exit用來跳出迴圈

loop
IF V_KBP IS NULL THEN
          EXIT;
   END IF;
end loop;

2:return跳出儲存過程

loop
IF V_KBP IS NULL THEN
        return;
   END IF;
end loop;

3:跳出loop 一次迴圈

oracle 11g已提供continue;
oracle 10g及以下,使用goto來替代,例如

SQL> set serveroutput on;
SQL> declare
  2  begin
  3    for i in 1..10 loop
  4      if mod(i,2)=0 then
  5        goto next;
  6      end if;
  7      dbms_output.put_line(i);
  8      <<next>>
  9      null;
10    end loop;
11  end;
12  /

注意:<<next>>標籤後的null;語句不可少,因為goto標籤後必須緊接著一個執行語句

4:Oracle迴圈中的EXITRETURNCONTINUE解密

注:本文來源於 《 Oracle迴圈中的EXITRETURNCONTINUE解密 》

有時候編寫Oracle中用遊標等資訊去迴圈處理邏輯的時候,對EXIT、RETURN、CONTINUE很容易搞混淆,網上搜了資料也不是很清楚,所以本人自己寫了一小段程式碼測試了這三種用法。案例程式碼如下:

PROCEDURE P_TASK IS
  BEGIN
    FOR MY_CU IN (SELECT SPBH, SPMCH FROM FUCM) LOOP
      FOR MY IN (SELECT SPBH, SPMCH FROM FUCM) LOOP
        IF MY_CU.SPBH = 'AAA' THEN
          RETURN;
          --exit;
          --continue;
        ELSIF MY.SPBH = 'BBB' THEN
          INSERT INTO FUCM_JG (SPBH, SPMCH) VALUES ('123', '123');
        ELSE
          INSERT INTO FUCM_JG (SPBH, SPMCH) VALUES ('222', '222');
        END IF;
        INSERT INTO FUCM_JG (SPBH, SPMCH) VALUES ('333', '333');
      END LOOP;
    END LOOP;
    INSERT INTO FUCM_JG (SPBH, SPMCH) VALUES ('444', '444');
  END P_TASK;

案例測試得到結果如下(分析的結果中注意本次迴圈和本迴圈的區別。本次迴圈是本迴圈執行的這次迴圈):

第一種:使用RETURN的時候,直接跳出儲存過程或者函式

第二種:使用EXIT的時候,跳出本迴圈轉而執行本迴圈的上一級迴圈的下一次迴圈。就此案例而言MY_CU.SPBH = 'AAA'為真的時候,直接跳出MY迴圈轉而去執行MY_CU的下一次迴圈

第三種:使用CONTINUE的時候,本次迴圈後面的程式碼部分不再執行,轉而執行本迴圈的下一次迴圈。就此案例而言MY_CU.SPBH = 'AAA'為真的時候,後面的程式碼不執行,繼續MY的下一次迴圈

相關文章