yanfangsheng123 发表于 2018-9-10 10:23:07

ORACLE PL/SQL练习(三)

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

页: [1]
查看完整版本: ORACLE PL/SQL练习(三)