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;
查看更多关于Oracle PL/SQL if 语句的详细内容...