Oracle基本修練: PL/SQL if-else, case statements

ChunJen Wang
jimmy-wang
Published in
5 min readSep 9, 2021

本篇記錄PL/SQL條件控制的主要寫法,並以範例練習。

Content

  • Part 1: if-else
  • Nested IF statement
  • Part 2: case when

Let’s Start!

Part 1: if-else

讓我們先從最完整的架構來看起,如同其他程式開發,如果需要多條件判斷,就必須以elsif接續不同條件的撰寫,而其也可以是只有判斷if為true執行某statement。

IF condition_1 THEN   
statements_1
ELSIF condition_2 THEN
statements_2
[ ELSIF condition_3 THEN
statements_3 ] ...
[ ELSE else_statements ]
END IF;

以最簡單的範例來說:
若數值大於100000,就印出,相對應的訊息。

DECLARE n_sales NUMBER := 2000000; 
BEGIN
IF n_sales > 100000 THEN
DBMS_OUTPUT.PUT_LINE('Sales revenue is greater than 100K');
END IF;
END;

但注意 !! 不要用笨 if( clumsy IF)!

DECLARE 
b_profitable BOOLEAN;
n_sales NUMBER;
n_costs NUMBER;
BEGIN
b_profitable := false;
IF n_sales > n_costs THEN
b_profitable := true;
END IF;
END;

為什麼這是笨if? 因為這一坨東西其實可以用一行code執行完成!
使用最簡單的不等式就可以得到相同的結果。

b_profitable := n_sales > n_costs;

另外,我們留意 IF 本身就是判斷 TRUE, FALSE or NULL,只有符合為 TRUE才會運行該 statements_1。

因此,如下例粗體部分完全是多餘的!

IF b_profitable = TRUE THEN 
DBMS_OUTPUT.PUT_LINE( ‘This sales deal is profitable’ );
END IF;

Nested IF statement

當然我們也可以用if來組成nested的結構,應用在需要多層判斷條件時使用。

IF condition_1 THEN 
IF condition_2 THEN
nested_if_statements;
END IF;
ELSE
else_statements;
END IF;

Part 2: case when

case when的寫法提供我們針對欄位給予一結果執行,並可以設計成多個條件,對應不同的結果,一樣讓我們從框架看起。

CASE selector 
WHEN (selector_value_1/condition_1) THEN
statements_1
WHEN (selector_value_1/condition_2) THEN
statement_2

ELSE
else_statements
END CASE;

其中有幾個放置的語法我們必須先學習:

  1. selector
    用以代表要被選擇的欄位,可以是多個,例如放入 selector_value_1 and selector_value_2
  2. WHEN selector_value THEN statements
    用來撰寫當被選擇的欄位(selector)值,符合條件when時,執行某一個statements
  3. ELSE else_statements
    而若完全沒有條件符合,就會執行else_statements

在此需要留意的是雖然 ELSE clause在此可以省略,但與if-else不同的是,這邊雖然省略不寫,但若有碰到進else的狀況,系統仍會報錯。以下為報錯訊息:

ELSE 
RAISE CASE_NOT_FOUND;

以一個計算commission的範例來說:
前面先宣告變數,並於執行時賦值,進入case when判斷sales業績可以使用哪一個公式,最終print出commission數值。

DECLARE
n_sales NUMBER;
n_commission NUMBER;
BEGIN
n_sales := 150000;
CASE
WHEN n_sales > 200000 THEN
n_commission := 0.2;
WHEN n_sales >= 100000 AND n_sales < 200000 THEN
n_commission := 0.15;
WHEN n_sales >= 50000 AND n_sales < 100000 THEN
n_commission := 0.1;
WHEN n_sales > 30000 THEN
n_commission := 0.05;
ELSE
n_commission := 0;
END CASE;
DBMS_OUTPUT.PUT_LINE( 'Commission is ' || n_commission * 100 || '%'
);
END;

要留意的是,case when也是逐一進行判斷,若前面已經有符合條件,那麼後面的條件就會被省略!

--

--

ChunJen Wang
jimmy-wang

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