首页 > 代码库 > 条件控制:IF & CASE语句

条件控制:IF & CASE语句

IF语句主要有以下三种基本形式:

一、 IF-THEN语句

       IF CONDITION THEN
           STATEMENT 1;
           ...
           STATEMENT N;
       END IF;

二、 IF-THEN-ELSE语句

       IF CONDITION THEN
           STATEMENT 1;
       ELSE
           STATEMENT 2;
       END IF;

三、 ELSLF语句

       IF CONDITION 1 THEN
           STATEMENT 1;
       ELSIF CONDITION 2 THEN
           STATEMENT 2;
       ELSIF CONDITION 3 THEN
           STATEMENT 3;
            ...
       ELSE
           STATEMENT N;  -->>在ELSIF语句中,ELSE子句并不是必需的
       END IF

下面,试举一例:用SYSDATE函数判断今天是否是周末,如果是周末的话,判断现在是上午还是下午。无论是否是周末,最后均显示日期。

注意:IF的嵌套用法和在ELSIF语句中,ELSE子句并不是必需的

       DECLARE             v_day varchar2(10);             v_time number(2);       BEGIN             v_day := RTRIM(to_char(sysdate,DAY));             v_time := to_char(sysdate,hh24);             IF v_day in (SATURDAY,SUNDAY) THEN   -->>下面嵌套了一个ELSIF语句                     IF v_time >= 6 AND v_time <12 THEN                            DBMS_OUTPUT.PUT_LINE(Good Moring);                     ELSIF v_time >=12 AND v_time <=18 THEN                            DBMS_OUTPUT.PUT_LINE(Good Afternoon);                     END IF;             END IF;             DBMS_OUTPUT.PUT_LINE(The time is: ||to_char(sysdate,yyyy-mm-dd hh24:mi:ss));        END;

  

CASE语句

CASE语句存在两种形式:CASE和搜索式CASE。

一、 CASE语句

       CASE SELECTOR
            WHEN EXPRESSION 1 THEN STATEMENT 1;
            WHEN EXPRESSION 2 THEN STATEMENT 2;
            ...
            WHEN EXPRESSION N THEN STATEMENT N;
            ELSE STATEMENT N+1;
        END CASE;

下面,试举一例:用于判断输入数值的奇偶性。

DECLARE  v_num NUMBER := &user_num;  v_num_flag NUMBER;BEGIN  v_num_flag := MOD(v_num,2);  CASE v_num_flag    WHEN 0 THEN      DBMS_OUTPUT.PUT_LINE(v_num|| is even number);    ELSE      DBMS_OUTPUT.PUT_LINE(v_num|| is odd number);  END CASE;END;

二、 搜索式CASE语句

       CASE
           WHEN SEARCH CONDITION 1 THEN STATEMENT 1;
           WHEN SEARCH CONDITION 2 THEN STATEMENT 2;
           ...
           WHEN SEARCH CONDITION N THEN STATEMENT N;
           ELSE STATEMENT N+1;
       END CASE;

以下用搜索式CASE语句重写上例  -->> 注意:没有声明v_num_flag变量,直接在WHEN中判断

DECLARE  v_num NUMBER := &user_num;BEGIN  CASE    WHEN MOD(v_num,2)=0 THEN      DBMS_OUTPUT.PUT_LINE(v_num|| is even number);    ELSE      DBMS_OUTPUT.PUT_LINE(v_num|| is odd number);  END CASE;END;

 

CASE表达式

倘若是使用CASE表达式,上述CASE语句和搜索式CASE语句可分别重写如下:

一、 对应CASE语句

DECLARE  v_num NUMBER := &user_num;  v_num_flag number;  v_result varchar2(30);BEGIN  v_num_flag := MOD(v_num,2);  v_result :=    CASE v_num_flag       WHEN 0 THEN          v_num|| is even number       ELSE          v_num || is odd number    END;  DBMS_OUTPUT.PUT_LINE(v_result);END;

二、 对应搜索式CASE语句

DECLARE  v_num NUMBER := &user_num;  v_result varchar2(30);BEGIN  v_result :=    CASE       WHEN MOD(v_num,2) =  0 THEN          v_num|| is even number       ELSE          v_num || is odd number    END;  DBMS_OUTPUT.PUT_LINE(v_result);END;

注意:CASE语句和CASE表达式之间的语法区别:在CASE语句中,WHEN和ELSE子句中的可执行语句以分号结尾。而在CASE表达式中,WHEN和ELSE子句所包含的表达式的结尾处不是分号。CASE语句以END CASE终止,CASE表达式以END结尾。