PL/SQL控制语句(一、分支控制语句)

1. IF-THEN-ELSE语句

IF语句共提供了如下3种类型的条件控制语句:

  IF语句:包含IF-THEN语句和IF-THEN-ELSE语句,仅允许单组选择,即如果条件成立,则执行语句块1,或者如果条件不成立,则执行语句块2。

  ELSIF语句:如果IF条件不成立时,允许包含多组选择,比如说如果条件1不成立,则判断ELSIF中的条件并执行代码,由于是多组选择,因此可以包含多个ELSIF语句。

  嵌套的IF语句:允许包含多组选择,与ELSIF非常相似。

 注意:ELSIF语句不同于ELSEIF,它少了一个字符E,不要与其他语句中的ELSEIF混肴。

最简单的IF语句的语法如下所示:

  IF confition

  THEN

  ...  顺序执行语句   ...

  END IF;

condition返回逻辑运算符的常量、变量或表达式,如果condition条件返回值True将执行THEN后面的顺序执行语句;END IF用来结束分支控制,如果不满足IF语句的条件,则不执行任何代码。

  注意:必须使用END IF作为IF语句块的终结语句。

  IF-THEN-ELSE语法:

  IF condition

  THEN

  ...条件为True时的顺序执行语句

  ELSE

  ...条件为False/NULL的顺序执行语句

  END IF;

例子:向人士管理系统中插入员工数据,使用IF THEN ELSE进行插入或者更新操作。

DECLARE

  v_count  NUMBER(10):=0;   --定义计数器变量

  v_empno  NUMBER(4):=7888;   --定义员工编号

BEGIN

  SELECT COUNT(1)    --首先查询指定的员工编号是否存在

  INTO v_count

  FROM emp

  WHERE empno = v_empno;

  --使用IF语句判断,如果员工编号不存在,结果为0

  IF v_count = 0

  THEN

  --则执行INSERT语句,插入新的员工记录

  INSERT INTO emp

    (empno,ename,job,hiredate,sal,deptno)

    VALUES(v_empno,'张三','经理','TRUNC(SYSDATE)','1000','20');

  ELSE    --否则,执行UPDATE语句

  UPDATE emp

  SET ename = '张三',

    job = '经理',

    hiredate = TRUNC(SYSDATE),

    sal = 1000,

    deptno  = 20

  WHERE empno = v_empno;

  END IF;

  --向数据库提交更改

  COMMIT;

EXCEPTION

  WHEN OTHERS

  THEN

    DBMS_OUTPUT.put_line(SQLERRM);     --输出异常信息

END;

/

示例中的v_count=0的返回值要么是True,要么是False,但是在一些场合,表达式运算的结果可能返回NULL值,NULL值被当作False条件结果,因此ELSE语句依然得以执行。

  

2.IF-THEN-ELSIF语句

IF-THEN-ELSIF,这种语句允许进行多分路分支选择。IF-THEN-ELSIF中可以包含多个ELSIF条件,声明语法如下:

  IF condition-1

  THEN

   statements-1

  ELSIF condition-N

  THEN

    statements - N

  [ELSE else_statements]

  END IF;

  

  当开始的IF条件condition1为False 或NULL时,则ELSIF将测试另一个条件,在一个IF中可以包含多条ELSIF语句,每一条都判断一个条件。只有当条件为True时,在ELSIF中包含的语句才会执行,同时会忽略掉其他的ELSIF语句,进入END IF。如果所有的条件都是False或NULL,执行控制将跳转到ELSE语句部分。

注意:在IF后面总是具有END IF, END IF之间具有一个空格,ELSIF中间没有空格,写成ELSEIF是非法的,所有的ELSIF语句之间是互相排斥的,条件从第一个到最后一个依序进行计算。

3.CASE语句

  CASE语句与许多高级语言中的SWITCH相似,用来一次性检查多个条件的值。

  CASE语句由一个选择器和一系列的WHEN语句块组成,选择器紧随在CASE语句的后面,如果没有提供选择器,PL/SQL将添加一个布尔值True作为选择器,选择器可以是任何的PL/SQL数据类型,但不可以是BLOB或BFILE及复合类型,比如记录、集合和用户自定义类型等。

  

  PL/SQL提供了如下两种类型的CASE语句:

    简单的CASE语句:简单CASE语句的选择器是一个变量或一个返回有效数据类型的函数,选择器不可以是布尔类型。

    搜索CASE语句:搜索CASE语句的选择器是布尔类型的变量或返回布尔类型的函数,默认的选择器为True,当搜索一个True表达式时,可以省略掉选择器的定义。

  与IF语句类似,CASE语句也有ELSE语句,ELSE语句的作用类似于在IF语句中的应用。ELSE语句是可选的,如果省略了ELSE语句,PL/SQL会隐含增加一个ELSE语句:

    ELSE RAISE CASE_NOT_FOUND;

注意:即使省略了ELSE语句,PL/SQL也会执行ELSE语句,程序执行时也会收到一个异常。

  简单CASE语句声明语法如下:

  CASE selector_variable

  WHEN criterion1 TH EN criterion1_statements;

  WHEN criterion2 THEN criterion2_statements;

  WHEN criterion(n+1) THEN criterion(n+1)_statements;

  ELSE

  block_statements;

  END CASE;

  紧随在CASE关键字后面的是选择器变量或函数,可以返回任何PL/SQL数据类型,但不能是布尔类型。

  搜索CASE语句

  简单的CASE语句又称检测式CASE语句,每一个WHEN子句都将一个值和CASE语句中要检测的值,即选择器进行比较。搜索CASE语句仅能用于布尔类型,在搜索CASE语句中,选择器被隐含设置为True,当然也可以显示地使用False条件。在搜索CASE语句中,每一个WHEN子句都包含一个布尔表达式,如果检测表达式的值为True,那么相应的子句将会被执行 。

注意:使用搜索类型的CASE表达式只能使用布尔类型的表达式。

声明语法如下:

  CASE[{True | False}]

    WHEN  [criterion1  |  expression1]  THEN

    criterion1_statements;

    WHEN   [criterion1  |  expression1 ]THEN

    criterion2_statements;

    WHEN [ criterion(n+1)  |  expression(n+1) ] THEN

    criterion(n+1)_statements;

    ELSE

    block_statements;

    END CASE;

  CASE后面的True和False是可选的,默认值为True;  WHEN子句中包含条件或表达式,同样包含了ELSE子句。

  

原文地址:https://www.cnblogs.com/harriets-zhang/p/10796192.html