Oracle PL/SQL | Day 3 | 運算表達式

在 Oracle – PL/SQL 程式設計中,表達式用於計算結果。根據不同的操作,常用的表達式包含 : 加減乘除、大於小於等於、 IF or ELSE、 WHEN…. CASE。

Oracle PL/SQL 練習範例

實際練習才有辦法在後續應付各種靈活的需求,以下為練習運算表達式的範例

範例 1 – 算術表達式

在 Oracle 中算術表達式就是利用加減乘除等運算符號連結起來的語法,如 : 1+2+9、20-9、a*b、j/k 等算數運算符號。

範例 : 計算絕對值

  • ABS : 為oracle 中內建將數值絕對值用
DECLARE
v_abs number(8);
BEGIN
    v_abs := ABS(100-20*3-152);
    DBMS_OUTPUT.put_line('v_abs :' || v_abs);
END;

範例 2 – 關係表達式 – 1

關係表達式主要是利用關係運算符號來進行判斷,利用運算符號得到一個布林值決定最終要輸出的結果,運算符號如下方清單所示。

  • =
  • >
  • <
  • >=
  • <=
  • != or <>

將上述的範例 多利用 IF 進行判斷是否 v_abs > 150

  • – 、 * : Oracle 運算符號
  • IF … THEN : 利用 if 進行判斷記得要在後面加上 THEN 才可以寫 if 區塊內程式
  • ELSE : 當 IF 判斷沒有成立 則會跳到這邊
  • END IF : 在 Oracle PL/SQL 中如果利用 IF 進行判斷需要在最後面加上 END IF (記得要加 ; )
DECLARE
v_abs number(8);
BEGIN
    v_abs := ABS(100-20*3-152);
    IF v_abs > 150 THEN
        DBMS_OUTPUT.put_line('v_abs :' || v_abs || ' > 150');
    ELSE
        DBMS_OUTPUT.put_line('v_abs :' || v_abs || ' <= 150');
    END IF;        
END;

範例 3 – 控制表達式

IF 條件控制語句

IF 條件判斷式就是對語句中不同的條件進行判斷,進而根據不同的條件執行不同的語句。主要包含IF…結構; IF…ELSE… 結構; IF…ELSIF… 結構。

IF… ELSIF…END IF; END; 的範例,利用控制語法來打考績

  • ELSIF : IF 結束得到 FALSE 後如果有 ELSIF 則會進行判斷 ELSIF 的條件
DECLARE
v_abs number(8);
BEGIN
    v_abs := 90;
    
    IF v_abs >=90 THEN
        DBMS_OUTPUT.PUT_LINE('你的考績為:' || 'A+');
    ELSIF v_abs >= 80 and v_abs < 90 THEN
        DBMS_OUTPUT.PUT_LINE('你的考績為:' || 'A');
    ELSIF v_abs >= 70 and v_abs < 80 THEN
        DBMS_OUTPUT.PUT_LINE('你的考績為:' || 'B+');
    ELSIF v_abs >= 60 and v_abs < 70 THEN
        DBMS_OUTPUT.PUT_LINE('你的考績為:' || 'B');
    ELSE
        DBMS_OUTPUT.PUT_LINE('你的考績為:' || 'C');
    END IF;
    DBMS_OUTPUT.PUT_LINE('考績打完');          
END;

CASE 條件控制語句

CASE 語法式根據條件對應的語法執行,就像是 JAVE or C# 中的 SWITCH CASE 語句,CASE語句包含兩種。

  • 簡單式 CASE 語句
  • 搜索式 CASE 語句
簡單式 CASE 語句

在 CASE 中帶入在判斷的值。並且將可能相等的條件依序列出來,如果成立則會輸出到對應的語句,

此範例為利用先前建立的 fruits table (link),再用CASE 語句找對水果編號對應的水果名稱:

select * from fruits
  • CASE [value] : 即將要進行判斷的值設定到value 中, 此範例將 v_fid 設定為value。
  • WHEN [condition] THEN : 將要比對的條件設定到 condition 中。
  • ELSE : 如果都沒有條件成立則會跳到這個 region 中 ( 如果沒有寫這個然後條件也沒有匹配上則會報錯 )
  • END CASE : 每個 CASE 語句都需要在最後面加上 END CASE ; (記得加上分號) 結尾 。
DECLARE
v_fid varchar(50);
BEGIN
    select f_id into v_fid from fruits where f_id = 'a5';
    CASE v_fid
        WHEN 'a1' THEN
            DBMS_OUTPUT.PUT_LINE('蘋果');
        WHEN 'a2' THEN
            DBMS_OUTPUT.PUT_LINE('香蕉');
        WHEN 'a3' THEN
            DBMS_OUTPUT.PUT_LINE('橘子');
        WHEN 'a4' THEN
            DBMS_OUTPUT.PUT_LINE('西瓜');
        WHEN 'a5' THEN
            DBMS_OUTPUT.PUT_LINE('椰子');
        WHEN 'a6' THEN
            DBMS_OUTPUT.PUT_LINE('葡萄');
        ELSE
            DBMS_OUTPUT.PUT_LINE('沒有找到對應水果');        
    END CASE;    
END;
搜尋式 CASE 語句

不在 CASE 中帶入在判斷的值,而是在 WHEN 中把值進行判斷。

此範例為上述的範例改寫至搜尋式CASE用法。

DECLARE
v_fid varchar(50);
BEGIN
    select f_id into v_fid from fruits where f_id = 'a5';
    CASE
        WHEN v_fid = 'a1' THEN
            DBMS_OUTPUT.PUT_LINE('蘋果');
        WHEN v_fid = 'a2' THEN
            DBMS_OUTPUT.PUT_LINE('香蕉');
        WHEN v_fid = 'a3' THEN
            DBMS_OUTPUT.PUT_LINE('橘子');
        WHEN v_fid = 'a4' THEN
            DBMS_OUTPUT.PUT_LINE('西瓜');
        WHEN v_fid = 'a5' THEN
            DBMS_OUTPUT.PUT_LINE('椰子');
        WHEN v_fid = 'a6' THEN
            DBMS_OUTPUT.PUT_LINE('葡萄');
        ELSE
            DBMS_OUTPUT.PUT_LINE('沒有找到對應水果');        
    END CASE;    
END;

範例 3 – LOOP 迴圈語句

LOOP 語句主要用於實現重複的循環操作。

  • <<name>> : 此為宣告 loop 名稱
  • EXIT name : EXIT 為某條件成立後跳出迴圈用
  • LOOP : 循環開始的符號
  • END LOOP; : 循環結束的符號 ( 記得加 ; )
DECLARE
v_sum NUMBER(4) := 10;
BEGIN
<<my_loop>>
LOOP
    DBMS_OUTPUT.PUT_LINE('當前 sum 為: ' || v_sum);
    v_sum := v_sum - 2;
    IF v_sum < 1 THEN
        DBMS_OUTPUT.PUT_LINE('退出LOOP 循環, 當前 v_sum :' || v_sum);
        EXIT my_loop;
    END IF;
END LOOP;
END;
參考書連結: link