oracle的exit、return、continue

風靈使發表於2018-11-16

1.先看exitreturn

exit 或是 return 用在loop 。。。。end loop;中都可以中斷迴圈,但是它們有一個很明顯的不同
看下面兩個例子:
例一:

CREATE OR replace PACKAGE BODY cux_test 
IS 
  PROCEDURE Main 
  IS 
    l_count NUMBER; 
    l_test  NUMBER := 6; 
  BEGIN 
      dbms_output.Put_line('開始迴圈'); 

      FOR l_count IN 1..10 LOOP 
          IF l_test = l_count THEN 
            dbms_output.Put_line('滿足條件,退出迴圈'); 
            
            RETURN; 
          ELSE 
            dbms_output.Put_line('繼續迴圈'); 
          END IF; 
      END LOOP; 

      dbms_output.Put_line('結束程式'); 
  END; 
END cux_test; 

例二:

CREATE OR replace PACKAGE BODY cux_test 
IS 
  PROCEDURE Main 
  IS 
    l_count NUMBER; 
    l_test  NUMBER := 6; 
  BEGIN 
      dbms_output.Put_line('開始迴圈'); 

      FOR l_count IN 1..10 LOOP 
          IF l_test = l_count THEN 
            dbms_output.Put_line('滿足條件,退出迴圈'); 

            exit; --exit when x>=8;可以加條件 
          ELSE 
            dbms_output.Put_line('繼續迴圈'); 
          END IF; 
      END LOOP; 

      dbms_output.Put_line('結束程式'); 
  END; 
END cux_test; 

下面來看以上兩個例子的執行結果:

例一:

開始迴圈
繼續迴圈
繼續迴圈
繼續迴圈
繼續迴圈
繼續迴圈
滿足條件,退出迴圈

例二:

開始迴圈
繼續迴圈
繼續迴圈
繼續迴圈
繼續迴圈
繼續迴圈
滿足條件,退出迴圈
結束程式

以上的例子說明了一個問題,exit只是單純的結束迴圈,但還會繼續執行程式包中其他的內容,而return則是直接中斷整個程式。

2.continue的作用是終止本次迴圈,開始下一次迴圈,它不是跳出迴圈。
oracle資料庫之前卻一直沒有支援continue語法,直到oracle11g加入了continue語法,其功能也是終止本次迴圈,開始下一次迴圈,exit語法的作用是跳出並結束迴圈。

BEGIN 
    FOR i IN 1 .. 20 LOOP 
        IF i < 10 THEN 
          CONTINUE; 
        END IF; 

        dbms_output.Put_line(i); 
    END LOOP; 
END; 

結果:

10
11
12
13
14
15
16
17
18
19
20

當i等於1到9的時候,程式執行到continue,使得當前迴圈停止,開始下一次迴圈,當i等於10的時候,不會執行到continue,所以從10開始輸出。


Oracle迴圈中的EXIT、RETURN、CONTINUE解密

有時候編寫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的下一次迴圈

相關文章