中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

8.PL_SQL——PL_SQL中的條件控制語句

發布時間:2020-06-29 16:12:51 來源:網絡 閱讀:1943 作者:wuyeyoulanjian 欄目:關系型數據庫

    和大多數程序語言一樣,PL/SQL也有控制語句執行的結構,主要包括:

             1、順序結構:程序從上往下執行逐條語句,就是順序結構;

             2、分支條件判斷:分支條件判斷主要是指的IF語句和CASE語句。

             3、循環語句:循環結構主要指的是REPEATLOOPDO WHILE語句。

    本章節主要講解條件判斷語句的用法。

 

一、 IF 語句的用法

                IF 語句的基本格式為:             

                IF conditionTHEN

                                statements

                [ ELSIF conditionTHEN 

                -- 注意,這里的ELSIF中間沒有EELSIF可以出現任意次

                statements]

                [ ELSE

                 statements

                ]

                END IF;

 

          IF 后面的判斷條件可以是布爾值,常量或表達式,判斷結果為TRUE, FALSENULL,其中NULL這種情況是PL/SQL中特有的,其他編程語言并不常見;

        如果IF后的條件判斷結果為TRUE,就執行THEN后面的語句;如果結果為FALSENULL,則不執行THEN后面的結果,而執行ELSE后面的語句。

 

下面看一個簡單的例子:

 

SQL> edit

 

DECLARE
        v_myage number :=31;
BEGIN
        IF v_myage < 11
        THEN
           DBMS_OUTPUT.PUT_LINE(' I am a child');
        ELSE
           DBMS_OUTPUT.PUT_LINE( ' I am not achild! ');
                 -- 由于IF后的條件判斷結果為FALSE,所以會執行這條語句
        END IF;
END;
/

 

SQL> /

I am not a child!
PL/SQL procedure successfullycompleted.

 

現在為上述例子多添加幾條分支進行條件判斷:

 

SQL> edit

BEGIN
        IF v_myage < 11 THEN
                DBMS_OUTPUT.PUT_LINE(' I am achild ');
                ELSIF v_myage < 20 THEN
                     DBMS_OUTPUT.PUT_LINE( 'Iam young ');
                ELSIF v_myage < 30 THEN
                     DBMS_OUTPUT.PUT_LINE( 'Iam in my twenties');
                ELSIF v_myage < 40 THEN
                     DBMS_OUTPUT.PUT_LINE( 'I am in mythirties');
                -- 由于31大于11,20,30,而小于40,所以執行這條語句
                ELSE
                     DBMS_OUTPUT.PUT_LINE( 'Iam always young ');
        END IF;
END;
/

 

SQL> /

I am in my thirties
PL/SQL procedure successfullycompleted.

 

如果IF條件判斷的結果為NULL,則不會執行THEN后面的語句。

 

SQL> edit

DECLARE
        v_myage NUMBER;
BEGIN
       -- IF v_myage IS NULL
                --這里的結果時TRUE,因為判斷是變量v_myage是否為NULL值,是就為TRUE,不是就為FALSE
        IF v_myage < 11 THEN
                -- 如果判斷的條件為NULL值,則結果為NULL
        THEN
           DBMS_OUTPUT.PUT_LINE(' I am a child');
        ELSE
           DBMS_OUTPUT.PUT_LINE( ' I am not achild! ');
        END IF;
END;
/

 

SQL> /

I am not a child
PL/SQL procedure successfullycompleted.

 

IF 語句的條件還可以使用AND,OR,NOT等邏輯符進行組合。

 

IF條件判斷語句中需要注意一些細節:

                a. IF END IF必須配對出現;

                b. END IF中間有空格;

                c. ELSIF中間沒有E

                d. END IF后面有分號“;

               

 

二、 CASE的用法

 

          CASE實際上IF語句的變體,當IF語句有大量類似的ELSIF判斷條件時,就可以使用CASE來進行簡化。CASE的用法可以分為兩種,一種是CASE表達式,另一種是CASE語句。

 

1CASE表達式

                CASE 表達式的基本格式為:  

                                CASE selector

                                                WHENexpression1 THEN result1

                                                WHENexpression2 THEN result2

                                                ...

                                                WHENexpressionN THEN resultN

                                                [ELSEresultN+1]

                                END;

                其中selector選擇值如果等于expression1的值,就執行result1,如果等于expression2,就執行result2...以此類推,如果沒有expression的值能與之匹配的,就執行resultN+1

               

                CASE表達式可以分為simple CASESearched CASE,其中simple CASE是指CASE后面會跟一個選擇值,然后將條件表達式的結果和這個選擇值進行比較,如下述這個例子:

 

SQL> edit                           

              

  SET VERIFY OFF
DECLARE
        v_grade CHAR(1) := UPPER('&grade');
        v_appraisal VARCHAR2(20);
BEGIN
        v_appraisal := CASE v_grade
                WHEN 'A' THEN 'Excellent'
                WHEN 'B' THEN 'Very Good'
                WHEN 'c' THEN 'Good'
                ELSE 'No such grade'
             END;
-- 從CASE到END這一部分是simple CASE,其運行結果作為一個值賦給v_appraisal這個變量。                               
        DBMS_OUTPUT.PUT_LINE ('Grade: ' ||v_grade || ' Appraisal ' || v_appraisal);
END;

               

SQL>  /

Enter value for grade: a
Grade: A Appraisal Excellent
PL/SQL procedure successfullycompleted.

 

SQL> /

Enter value for grade: s
Grade: S Appraisal No suchgrade
PL/SQL procedure successfullycompleted.

 

         Searched CASE CASE后面沒有選擇值selector,而是直接判斷關鍵字WHEN后面表達式的布爾值,如下面這個例子:

 

SQL> edit

DECLARE
        v_grade CHAR(1) := UPPER('&grade');
        v_appraisal VARCHAR2(20);
BEGIN
        v_appraisal := CASE
                -- 這里的CASE沒有選擇值了
                WHEN v_grade = 'A' THEN'Excellent'
                -- 直接在條件判斷部分完成布爾值的返回
                WHEN v_grade IN ('B','C') THEN'Good'
                ELSE 'No such grade'
        END;
        DBMS_OUTPUT.PUT_LINE ('Grade: ' ||v_grade || ' Appraisal ' ||v_appraisal);
END;
/

 

SQL>/

Enter value for grade: A
Grade: A   Appraisal Excellent
PL/SQL procedure successfullycompleted.

 

SQL> /

Enter value for grade: o
Grade: O  Appraisal No such grade
PL/SQL procedure successfullycompleted.

 

SQL> /

Enter value for grade: b
Grade: B  Appraisal Good
PL/SQL procedure successfullycompleted.

 

2CASE語句

CASE語句就是一條條獨立的語句,它不能將運行結果再賦值給其他的變量了。

如下面這個例子:

 

SQL> edit

DECLARE
        v_deptid NUMBER;
        v_deptname VARCHAR2(20);
        V_emps NUMBER;
        v_mngid NUMBER:= 108;
BEGIN
        CASE v_mngid
            WHEN 108 THEN
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 108;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
            --CASE語句不再作為一個整體將運行結果賦值給其他變量了                                     
            WHEN 200 THEN
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 200;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
           ELSE
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 100;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
        END CASE;
            --CASE語句中必須有END CASE,如果是CASE表達式就不需要END CASE。
 
        DBMS_OUTPUT.PUT_LINE('You are workingin the ' || v_deptname || ' department. There are ' ||v_emps || 'employees inthis department');
END;
/

SQL> /

You are working in theFinance department. There are 6 employees in this
department
PL/SQL procedure successfullycompleted.

 

           CASE語句也分為SimpleCASE語句和Searched CASE語句。他們之間的區別和CASE表達式一樣。上述例子屬于SimpleCASE的用法,如果要使用Searched CASE語句,可以寫成如下形式:

 

SQL> edit

DECLARE
        v_deptid NUMBER;
        v_deptname VARCHAR2(20);
        V_emps NUMBER;
        v_mngid NUMBER:= 100;
BEGIN
        CASE
            WHEN v_mngid = 108 THEN
                --v_mngid不作為選擇值,而是直接在WHEN后面進行判斷
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 108;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
                                               
            WHEN v_mngid = 200 THEN
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 200;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
           ELSE
                SELECT department_id,department_name
                INTO v_deptid, v_deptname
                FROM departments
                WHERE manager_id = 100;
 
                SELECT count(*)
                INTO v_emps
                FROM employees
                WHERE department_id = v_deptid;
        END CASE;
        
        DBMS_OUTPUT.PUT_LINE('You are workingin the ' || v_deptname || ' department. There are ' ||v_emps || 'employees inthis department');
END;
/

 

SQL> /

You are working in theExecutive department. There are 3 employees in this
department
PL/SQL procedure successfullycompleted.

三、關于NULL值的處理

NULL值在PL/SQL中有一些特殊的屬性:

a. 在簡單的比較運算表達式里如果有NULL值參與運算,最終的結果將表現為NULL值;

b.  在邏輯運算中如果出現了 NOT NULL,則結果還是NULL,只有寫成IS NULL或者是IS NOT NULL,才能得到TRUE或者FALSE的值;

c. IF條件判斷語句中只有結果為TRUE時,才執行THEN后面的語句,如果結果為NULL或者FASLE,則不會執行

d. NULL值在PL/SQL中還可以單獨成為一條語句,用來表示什么都不做,例如:


                IF conditions THEN

                                Dosome thing;

                ELSE

                                NULL;

                               

使用NULL語句的主要有:

                1. 增強程序的可讀性。

                2. 在標簽后面使用NULL

                標簽的用法后文會詳解,這里先舉個小例子:                                           

                                DECLARE

                                                ...

                                BEGIN

                                                IFconditions THEN

                                                      GOTO LastPoint

         -- GOTO表示執行到這一步時,直接跳轉到標簽LastPoint所在的位置。

                                                ENDIF

                                                ...

                                <<LastPoint>>

         --標簽LastPoint的后面應該有語句,但在生產環境中經常會碰到標簽后面不做任何操作的情況

         --使用NULL;語句,可以既滿足語法規則,又不做任何操作。

                                                NULL;

                                END;


 

四、條件判斷中的邏輯關系

1. 邏輯運算符AND,ORNOT

         在進行條件判斷時可以使用邏輯運算符AND, OR NOT,當布爾值和邏輯運算符組合起來后會形成各種邏輯關系:

8.PL_SQL——PL_SQL中的條件控制語句

2. 短路現象

         短路操作是指在邏輯判斷中只用判斷一部分條件而無需判斷整個條件的運算方式。如果邏輯運算符是AND,則AND前面的條件判斷為FALSE后,就不繼續判斷AND后面的條件了;如果邏輯運算符是OR,則OR前面的條件判斷為真后,就不繼續判斷OR后面的條件了。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奈曼旗| 房山区| 香港| 阳山县| 凌源市| 罗定市| 美姑县| 宜州市| 邵武市| 二连浩特市| 云林县| 榕江县| 界首市| 珲春市| 库车县| 上饶县| 营山县| 根河市| 青阳县| 安乡县| 精河县| 本溪| 崇文区| 兰考县| 措勤县| 彰化市| 剑川县| 全州县| 韶关市| 西峡县| 万安县| 新沂市| 台湾省| 崇阳县| 肇源县| 宜君县| 长岛县| 台中市| 鄂伦春自治旗| 江阴市| 麟游县|