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

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

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;