和大多數(shù)程序語言一樣,PL/SQL也有控制語句執(zhí)行的結(jié)構(gòu),主要包括:
專注于為中小企業(yè)提供網(wǎng)站設(shè)計、網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)撫寧免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
1、順序結(jié)構(gòu):程序從上往下執(zhí)行逐條語句,就是順序結(jié)構(gòu);
2、分支條件判斷:分支條件判斷主要是指的IF語句和CASE語句。
3、循環(huán)語句:循環(huán)結(jié)構(gòu)主要指的是REPEAT、LOOP和DO WHILE語句。
本章節(jié)主要講解條件判斷語句的用法。
一、 IF語句的用法
IF 語句的基本格式為:
IF conditionTHEN
statements;
[ ELSIF conditionTHEN
--注意,這里的ELSIF中間沒有E,ELSIF可以出現(xiàn)任意次
statements;]
[ ELSE
statements;
]
END IF;
IF 后面的判斷條件可以是布爾值,常量或表達式,判斷結(jié)果為TRUE, FALSE或NULL,其中NULL這種情況是PL/SQL中特有的,其他編程語言并不常見;
如果IF后的條件判斷結(jié)果為TRUE,就執(zhí)行THEN后面的語句;如果結(jié)果為FALSE和NULL,則不執(zhí)行THEN后面的結(jié)果,而執(zhí)行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后的條件判斷結(jié)果為FALSE,所以會執(zhí)行這條語句 END IF; END; /
SQL> /
I am not a child! PL/SQL procedure successfullycompleted.
現(xiàn)在為上述例子多添加幾條分支進行條件判斷:
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,所以執(zhí)行這條語句 ELSE DBMS_OUTPUT.PUT_LINE( 'Iam always young '); END IF; END; /
SQL> /
I am in my thirties PL/SQL procedure successfullycompleted.
如果IF條件判斷的結(jié)果為NULL,則不會執(zhí)行THEN后面的語句。
SQL> edit
DECLARE v_myage NUMBER; BEGIN -- IF v_myage IS NULL --這里的結(jié)果時TRUE,因為判斷是變量v_myage是否為NULL值,是就為TRUE,不是就為FALSE IF v_myage < 11 THEN -- 如果判斷的條件為NULL值,則結(jié)果為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條件判斷語句中需要注意一些細節(jié):
a. IF和 END IF必須配對出現(xiàn);
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的值,就執(zhí)行result1,如果等于expression2,就執(zhí)行result2...以此類推,如果沒有expression的值能與之匹配的,就執(zhí)行resultN+1。
CASE表達式可以分為simple CASE和Searched CASE,其中simple CASE是指CASE后面會跟一個選擇值,然后將條件表達式的結(jié)果和這個選擇值進行比較,如下述這個例子:
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,其運行結(jié)果作為一個值賦給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,而是直接判斷關(guān)鍵字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語句就是一條條獨立的語句,它不能將運行結(jié)果再賦值給其他的變量了。
如下面這個例子:
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語句不再作為一個整體將運行結(jié)果賦值給其他變量了 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語句。他們之間的區(qū)別和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.
三、關(guān)于NULL值的處理
NULL值在PL/SQL中有一些特殊的屬性:
a. 在簡單的比較運算表達式里如果有NULL值參與運算,最終的結(jié)果將表現(xiàn)為NULL值;
b. 在邏輯運算中如果出現(xiàn)了 NOT NULL,則結(jié)果還是NULL,只有寫成IS NULL或者是IS NOT NULL,才能得到TRUE或者FALSE的值;
c. IF條件判斷語句中只有結(jié)果為TRUE時,才執(zhí)行THEN后面的語句,如果結(jié)果為NULL或者FASLE,則不會執(zhí)行
d. NULL值在PL/SQL中還可以單獨成為一條語句,用來表示什么都不做,例如:
IF conditions THEN
Dosome thing;
ELSE
NULL;
使用NULL語句的主要有:
1. 增強程序的可讀性。
2. 在標簽后面使用NULL。
標簽的用法后文會詳解,這里先舉個小例子:
DECLARE
...
BEGIN
IFconditions THEN
GOTO LastPoint
-- GOTO表示執(zhí)行到這一步時,直接跳轉(zhuǎn)到標簽LastPoint所在的位置。
ENDIF
...
<<LastPoint>>
--標簽LastPoint的后面應(yīng)該有語句,但在生產(chǎn)環(huán)境中經(jīng)常會碰到標簽后面不做任何操作的情況
--使用NULL;語句,可以既滿足語法規(guī)則,又不做任何操作。
NULL;
END;
四、條件判斷中的邏輯關(guān)系
1.邏輯運算符AND,OR和NOT
在進行條件判斷時可以使用邏輯運算符AND, OR 和NOT,當布爾值和邏輯運算符組合起來后會形成各種邏輯關(guān)系:
2.短路現(xiàn)象
短路操作是指在邏輯判斷中只用判斷一部分條件而無需判斷整個條件的運算方式。如果邏輯運算符是AND,則AND前面的條件判斷為FALSE后,就不繼續(xù)判斷AND后面的條件了;如果邏輯運算符是OR,則OR前面的條件判斷為真后,就不繼續(xù)判斷OR后面的條件了。
網(wǎng)頁標題:8.PL_SQL——PL_SQL中的條件控制語句
URL標題:http://aaarwkj.com/article28/pcsojp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、小程序開發(fā)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司、全網(wǎng)營銷推廣、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)