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子句。