布爾直接量ide
DECLAREurl
enough_money BOOLEAN; -- 聲明一個布爾類型變量spa
BEGINorm
enough_money := FALSE; -- 給這個變量賦值it
END; io
檢查布爾表達式的值無需引用這些直接量,只讓表達式本身說就能夠了。table
DECLAREclass
enough_money BOOLEAN;變量
BEGINselect
IF enough_money
THEN
... ...
IF語句有三種使用方法:
IF類型 | 特色 |
IF THEN END IF; | 最簡單的用法,IF和THEN之間的條件決定了THEN和END IF之間的一系列語句是否會被執行,若是條件部分的求值結果是FALSE或NULL,這些代碼就不會執行。 |
IF THEN ELSE END IF; | 實現了二選一的邏輯。根據對位於IF和THEN之間的條件的求值結果,或者是THEN和ELSE之間的代碼被執行,或者是ELSE和END IF之間的代碼被執行。總之,這兩部分代碼確定有一個會被執行。 |
IF THEN ELSIF ELSE END IF; | 最複雜的形式。IF語句會從一系列互斥條件中選擇一個是TRUE,而後執行該條件關聯的語句。ORACLE 9iR1以後,建議用CASE替代。 |
短路求值:
PL/SQL使用短路求值方法,也就是說PL/SQL不須要對一個IF語句中的全部表達式都去求值。
將代價昂貴的條件放在整個條件集的最後
IF low_CPU_condition AND high_CPU_condition
THEN
...
END IF;
嵌套IF語句也能實現短路求值同樣的效果
IF low_CPU_condition
THEN
IF high_CPU_condition
THEN
...
END IF;
END IF;
只有在low_CPU_condition是TRUE的前提下,high_CPU_condition纔會被求值,一樣實現了短路效果。
CASE語句和表達式
區別:CASE表達式的結果就是一個值,CASE語句的結果是執行一系列的PL/SQL語句。
簡單CASE語句:經過值來關聯一個或多個PL/SQL語句,根據表達式的返回值來選擇哪個語句會被執行。
搜索形式的CASE語句:根據一系列布爾條件來肯定要執行的PL/SQL語句系列。那些和第一個求值結果是TRUE的
條件相關聯的語句會被執行。
簡單CASE語句
CASE employee_type
WHEN 'S' THEN
award_salary_bonus(employee_id);
WHEN 'H' THEN
award_hourly_bonus(employee_id);
WHEN 'C' THEN
award_commissioned_bonus(employee_id);
ELSE -- ELSE子句是可選的
RAISE invalid_employee_type;
END CASE;
若是沒有明確指定ELSE子句,PL/SQL會隱含的使用下面的方法。
ELSE
RAISE CASE_NOT_FOUND;
即若是沒有明確地使用ELSE子句,並且有沒有WHEN子句可以匹配CASE表達式的結果,PL/SQL就會拋出一個
CASE_NOT_FOUND的錯誤。
用CASE語句來實現津貼發放邏輯
CASE TRUE
WHEN salary >= 10000 AND salary <= 20000
THEN
give_bonus(employee_id,1500);
WHEN salary > 20000 AND salary <= 40000
THEN
give_bonus(employee_id,1000);
WHEN salary > 40000
THEN
give_bonus(employee_id,500);
ELSE
give_bonus(employee_id,0);
END CASE;
爲了不出現CASE_NOT_FOUND錯誤,必定要確保至少有一個條件會知足。
CASE語句的規則:
①一旦某些語句被執行,整個執行也就結束了。即使有多個表達式結果都是TRUE,也只有和第一個表達式相關連的語句會被執行;
②ELSE語句是可選的,若是沒有指定ELSE,而且沒有一個表達式的求值結果是TRUE,就會拋出CASE_NOT_FOUND異常。
③WHEN表達式是按照從上到下的次序依次求值。
CASE表達式
分兩種:
簡單CASE表達式
搜索形式CASE表達式
NULL語句
有時但願PL/SQL不要作任何事
格式:
NULL;
場景:
1.增長程序可讀性:
IF :report_mgr.selection = 'DETAIL'
THEN
exec_detail_report
ELSE
NULL; -- Do nothing
END IF;