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; / 

上面的代码生成以下结果:

Oracle PL/SQL if 语句

 

嵌套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; / 

上面的代码生成以下结果:

Oracle PL/SQL if 语句

 

短路评估

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;