布尔直接量
DECLARE
enough_money BOOLEAN; -- 声明一个布尔类型变量
BEGIN
enough_money := FALSE; -- 给这个变量赋值
END;
检查布尔表达式的值无需引用这些直接量,只让表达式自己说就可以了。
DECLARE
enough_money BOOLEAN;
BEGIN
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;