Oracle PL/SQL if 语句
IF语句允许您实现条件分支逻辑。
IF语句有三种风格
- IF THEN END IF;
- IF THEN ELSE END IF;
- IF THEN ELSIF ELSE END IF;
IF-THEN语句
IF语句的最简单形式具有由关键字THEN和END IF包围的语句序列的条件。
仅当条件为TRUE时,才执行语句序列。
如果条件为FALSE或NULL,则IF语句不执行任何操作。
IF-THEN语法的一般格式如下:
IF condition
THEN
... sequence of executable statements ...
END IF;
条件是一个布尔变量,常量或表达式,计算结果为TRUE,FALSE或NULL。
如果condition的值为TRUE,则执行THEN关键字和匹配的END IF语句之间的可执行语句。
如果condition的值为FALSE或NULL,则不执行这些语句。
以下IF条件比较两个不同的数值。
如果这两个值之一为NULL,则整个表达式返回NULL。
IF salary > 400
THEN
raise_salary(employee_id,5);
END IF;
我们可以使用IS NULL来测试是否存在NULL:
IF salary > 400 OR salary IS NULL
THEN
raise_salary (employee_id,5);
END IF;
例:
DECLARE -- from w w w.j a v a 2 s. co m
n_val1 NUMBER(4,2) := 1;
n_val2 NUMBER(4,2) := 2;
n_val3 NUMBER(4,2) := 0;
emp_id NUMBER(6) := 120;
BEGIN
IF n_val1 > (n_val2 + 2) THEN
n_val3 := (n_val1 - n_val2)/4;
END IF;
END;
/
IF-THEN-ELSE语句
IF-THEN-ELSE格式在两个互斥操作之间选择。
此IF或IF语句的格式如下:
IF condition
THEN
... TRUE sequence of executable statements ...
ELSE
... FALSE/NULL sequence of executable statements ...
END IF;
下面是IF-THEN-ELSE结构的一个例子。
IF salary <= 400
THEN
raise_salary (employee_id, 0);
ELSE
raise_salary (employee_id, 500);
END IF;
如果工资可能为NULL,您可以使用NVL功能保护自己免受此问题的影响:
IF NVL(salary,0) <= 400
THEN
raise_salary (employee_id, 0);
ELSE
raise_salary (employee_id, 500);
END IF;
IF语句可以具有关键字ELSE,后面是替代语句序列。
仅当条件为FALSE或NULL时,才会执行ELSE子句中的语句。
DECLARE -- w w w . j a v a 2 s . c om
n_val1 NUMBER(8,2) := 1;
n_val2 NUMBER(8,2) := 2;
n_val3 NUMBER(6,2);
emp_id NUMBER(6) := 2;
BEGIN
IF n_val1 > (n_val2 + 2) THEN
n_val3 := (n_val1 - n_val2)/4;
ELSE
n_val3 := 50;
END IF;
DBMS_OUTPUT.PUT_LINE(n_val3);
END;
/
上面的代码生成以下结果:
嵌套IF
IF语句可以嵌套。
您可以在任何其他IF语句中嵌套任何IF语句。
以下IF语句显示了几层嵌套:
IF condition1
THEN -- from w ww . java 2 s . com
IF condition2
THEN
statements2
ELSE
IF condition3
THEN
statements3
ELSIF condition4
THEN
statements4
END IF;
END IF;
END IF;
以下代码显示嵌套的IF-THEN-ELSE语句。
DECLARE -- from w w w . j a va2 s . c o m
n_val1 NUMBER(8,2) := 1;
n_val2 NUMBER(8,2) := 2;
n_val3 NUMBER(6,2);
BEGIN
IF n_val1 > (n_val2 + 2) THEN
n_val3 := (n_val1 - n_val2)/4;
ELSE
IF n_val1 > n_val2 THEN
n_val3 := 50;
ELSE
n_val3 := 0;
END IF;
END IF;
END;
/
IF-THEN-ELSIF语句
IF-THEN-ELSIF组合允许我们实现具有许多替代方案的逻辑。
这种IF变体的一般格式是:
IF condition-1
THEN
statements-1
ELSIF condition-N
THEN
statements-N
[ELSE
else_statements]
END IF;
要在几个选项之间进行选择,请使用关键字ELSIF来检查其他条件。
如果第一个条件为FALSE或NULL,则ELSIF子句测试另一个条件。
最后一个ELSE子句是可选的。
条件从上到下逐个评估。
DECLARE -- from ww w . ja v a2 s . c om
n_val1 NUMBER(8,2) := 2;
n_val3 NUMBER(6,2);
emp_id NUMBER(6) := 1;
BEGIN
IF n_val1 > 5 THEN
n_val3 := 5;
ELSIF n_val1 > 3 THEN
n_val3 := 3;
ELSE
n_val3 := 1;
END IF;
END;
/
下面的代码有很多分支。
DECLARE
grade CHAR(1);
BEGIN
grade := 'A';
IF grade = 'A' THEN
DBMS_OUTPUT.PUT_LINE('Excellent');
ELSIF grade = 'B' THEN
DBMS_OUTPUT.PUT_LINE('Very Good');
ELSIF grade = 'C' THEN
DBMS_OUTPUT.PUT_LINE('Good');
ELSIF grade = 'D' THEN
DBMS_OUTPUT. PUT_LINE('Fair');
ELSIF grade = 'F' THEN
DBMS_OUTPUT.PUT_LINE('Poor');
ELSE
DBMS_OUTPUT.PUT_LINE('No such grade');
END IF;
END;
/
上面的代码生成以下结果:
短路评估
PL / SQL使用短路评估。
PL / SQL不需要计算IF语句中的所有表达式。
例如,当在以下IF语句中计算表达式时,如果第一个操作数为FALSE或NULL,PL / SQL将停止计算并立即执行ELSE分支:
IF condition1 AND condition2
THEN
...
ELSE
...
END IF;
当condition1为FALSE或NULL时,PL / SQL可以停止表达式的求值,因为只有当表达式的结果为TRUE时才执行THEN分支。
如果IF语句中OR操作的第一个操作数为TRUE,PL / SQL立即执行THEN分支:
IF condition1 OR condition2
THEN
...
ELSE
...
END IF;