Oracle基本修練: PL/SQL GOTO, NULL statements

ChunJen Wang
jimmy-wang
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,LOOPstatemects子句。
  • 當然,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,也就是不做任何事情,所有的程式都將繼續。

使用其好處在於

  1. 提高code可讀性
  2. 提供GOTO statements目標句
  3. 為要開發的子程序佔位

例如有依功能為寄送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後面必定要跟 「;」 ,否則系統會報錯。

--

--

ChunJen Wang
jimmy-wang

嗨,歡迎你的到來,我目前在銀行擔任DS。過去曾做過銀行大型專案BA,也曾在轉職科技業DE中踢了鐵板,相信每一個人都有自己要走的路,而努力的過程,可以讓我們離心中理想更接近,如果我的文章能帶給你一些啟發與幫助,別忘了幫我在文章底下按下拍手~^^