Oracle儲存過程中跳出迴圈的寫法
阿新 • • 發佈:2018-12-11
記錄exit
和return
的用法
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迴圈中的EXIT
、RETURN
、CONTINUE
解密
注:本文來源於 《 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
的下一次迴圈