在 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;