您好,登錄后才能下訂單哦!
和大多數程序語言一樣,PL/SQL也有控制語句執行的結構,主要包括:
1、順序結構:程序從上往下執行逐條語句,就是順序結構;
2、分支條件判斷:分支條件判斷主要是指的IF語句和CASE語句。
3、循環語句:循環結構主要指的是REPEAT、LOOP和DO WHILE語句。
本章節主要講解條件判斷語句的用法。
一、 IF 語句的用法
IF 語句的基本格式為:
IF conditionTHEN
statements;
[ ELSIF conditionTHEN
-- 注意,這里的ELSIF中間沒有E,ELSIF可以出現任意次
statements;]
[ ELSE
statements;
]
END IF;
IF 后面的判斷條件可以是布爾值,常量或表達式,判斷結果為TRUE, FALSE或NULL,其中NULL這種情況是PL/SQL中特有的,其他編程語言并不常見;
如果IF后的條件判斷結果為TRUE,就執行THEN后面的語句;如果結果為FALSE和NULL,則不執行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語句。
(1)CASE表達式:
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 CASE和Searched 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.
(2)CASE語句
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,OR和NOT
在進行條件判斷時可以使用邏輯運算符AND, OR 和NOT,當布爾值和邏輯運算符組合起來后會形成各種邏輯關系:
2. 短路現象
短路操作是指在邏輯判斷中只用判斷一部分條件而無需判斷整個條件的運算方式。如果邏輯運算符是AND,則AND前面的條件判斷為FALSE后,就不繼續判斷AND后面的條件了;如果邏輯運算符是OR,則OR前面的條件判斷為真后,就不繼續判斷OR后面的條件了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。