Oracle基本修練: PL/SQL GOTO, NULL statements
Published in
4 min readSep 12, 2021
本篇記錄PL/SQL條件控制附加的寫法,可以幫助我們在執行模塊中,更加彈性的來使用,如GOTO, NULL,並以範例練習。
Content
- Part 1: GOTO
- Part 2: NULL
Let’s Start!
Part 1: GOTO introduction
採用GOTO可以讓我們將控制標籤直接帶到指定可執行區塊或已經撰寫好的statements。
-- 例如在下列執行區塊,我們可以依序看到執行順序為 2 > 1 > end
BEGIN
GOTO second_message; <<first_message>>
DBMS_OUTPUT.PUT_LINE( 'Hello' );
GOTO the_end; <<second_message>>
DBMS_OUTPUT.PUT_LINE( 'PL/SQL GOTO Demo' );
GOTO first_message; <<the_end>>
DBMS_OUTPUT.PUT_LINE( 'and good bye...' ); END;
其輸出結果就會是
PL/SQL GOTO Demo
Hello
and good Bye…
GOTO的限制
- GOTO無法直接將控制移轉到
IF
,CASE
,LOOP
statemects子句。 - 當然,GOTO也不能使用在子句之間移轉,
例如IF
子句下GOTO到ELSE
子句或ELSIF
子句,
或是WHEN
裡面GOTO到其他CASE
中。 - GOTO在無法將控制移轉到異常處理區塊(exception handler),反之從異常處理跳回執行區塊也是無法執行的。
DECLARE
n_sales NUMBER;
n_tax NUMBER;
BEGIN
GOTO inside_if_statement;
IF n_sales > 0 THEN
<<inside_if_statement>> -- 無法直接GOTO到IF內!
n_tax := n_sales * 0.1;
END IF;
END;
系統將會發送error
PLS-00375: illegal GOTO statement; this GOTO cannot branch to label ‘INSIDE_IF_STATEMENT’
Part 2: NULL introduction
在控制模塊中,使用NULL相當於在Python使用pass,也就是不做任何事情,所有的程式都將繼續。
使用其好處在於
- 提高code可讀性
- 提供GOTO statements目標句
- 為要開發的子程序佔位
例如有依功能為寄送email,當我們讀到其職稱為Sales Representative就寄email,
IF job_title = ‘Sales Representative’ THEN
send_email;
ELSE
NULL;
END IF;
在此我們保留NULL以提醒可能還有其他狀況,未來若需要添加,便可在此新增。
而為GOTO提供目標句的用法如
DECLARE
b_status BOOLEAN
BEGIN
IF b_status THEN
GOTO end_of_program;
END IF;
-- further processing here
-- …
<<end_of_program>>
NULL;
END;
需要留意的是NULL後面必定要跟 「;」 ,否則系統會報錯。
以上為PL/SQL會使用到的GOTO與NULL使用方式。
資料來源:
https://www.oracletutorial.com/plsql-tutorial/plsql-goto/
https://www.oracletutorial.com/plsql-tutorial/plsql-null/