布尔直接量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;