- Oracle 11g從入門到精通(第2版) (軟件開發視頻大講堂)
- 明日科技
- 2472字
- 2020-11-28 15:54:58
5.3 流程控制語句
視頻講解:光盤\TM\lx\5\流程控制語句.mp4
結構控制語句是所有過程性程序設計語言的關鍵,因為只有能夠進行結構控制才能靈活地實現各種操作和功能,PL/SQL也不例外,其主要控制語句如表5.3所示。
表5.3 PL/SQL控制語句列表

若要在PL/SQL中實現控制程序的執行流程和實現復雜的業務邏輯計算,就必須使用流程控制語句,因為只有能夠進行結構控制才能靈活地實現各種復雜操作和功能,PL/SQL中的流程控制語句主要包括選擇語句、循環語句兩大類,下面將對這兩種控制語句進行詳細講解。
5.3.1 選擇語句
選擇語句也稱之為條件語句,它的主要作用是根據條件的變化選擇執行不同的代碼,主要分為以下4種語句。
1.IF…THEN語句
IF…THEN語句是選擇語句中最簡單的一種形式,它只做一種情況或條件的判斷,其語法格式如下:
if < condition_expression> then plsql_sentence end if;
condition_expression:表示一個條件表達式,當其值為true時,程序會執行IF下面的PL/SQL語句(即plsql_sentence語句);如果其值為false,則程序會跳過IF下面的語句而直接執行end if后面的語句。
plsql_sentence:當condition_expression表達式的值為true時,要執行的PL/SQL語句。
【例5.11】 定義兩個字符串變量,然后賦值,接著使用IF…THEN語句比較兩個字符串變量的長度,并輸出比較結果,代碼如下(實例位置:光盤\TM\sl\5\5)。
SQL> set serveroutput on SQL> declare 2 var_name1 varchar2(50); --定義兩個字符串變量 3 var_name2 varchar2(50); 4 begin 5 var_name1:='East'; --給兩個字符串變量賦值 6 var_name2:='xiaoke'; 7 if length(var_name1)<length(var_name2)then --比較兩個字符串的長度大小 8 /*輸出比較后的結果*/ 9 dbms_output.put_line(’字符串“'||var_name1||'”的長度比字符串“'||var_name2||'”的長度小’); 10 end if; 11 end; 12 / --執行代碼
本例運行結果如圖5.5所示。

圖5.5 使用if…then語句比較兩個字符串長度
在上面的例子中,字符串“East”的長度(4)肯定小于字符串“xiaoke”的長度(6),所以if后面的條件表達式的值為true,這樣程序就會執行if下面的PL/SQL語句。
如果IF后面的條件表達式存在“并且”、“或者”、“非”等邏輯運算,則可以使用“and”、“or”、“not”等邏輯運算符。另外,如果要判斷IF后面的條件表達式的值是否為空值,則需要在條件表達式中使用“is”和“null”關鍵字,比如下面的代碼:
if last_name is null then …; end if;
2.IF…THEN…ELSE語句
在編寫程序的過程中,IF…THEN…ELSE語句是最常用到的一種選擇語句,它可以實現判斷兩種情況,只要if后面的條件表達式為false,程序就會執行else語句下面的PL/SQL語句。其語法格式如下:
if < condition_expression> then plsql_sentence1; else plsql_sentence2; end if;
condition_expression:表示一個條件表達式,若該條件表達式的值為true,則程序執行if下面的PL/SQL語句,即plsql_sentence1語句;否則,程序將執行else下面的PL/SQL語句,即plsql_sentence2語句。
plsql_sentence1:IF語句的表達式值為true時,要執行的PL/SQL語句。
plsql_sentence2:IF語句的表達式值為false時,要執行的PL/SQL語句。
【例5.12】 通過IF…ELSE語句實現只有年齡大于等于56歲,才可以申請退休的功能,否則程序會提示不可以申請退休,代碼如下(實例位置:光盤\TM\sl\5\6)。
SQL> set serveroutput on SQL> declare 2 age int:=55; --定義整形變量并賦值 3 begin 4 if age>=56 then --比較年齡是否大于56歲 5 dbms_output.put_line(’您可以申請退休了!'); --輸出可以退休信息 6 else 7 dbms_output.put_line(’您小于56歲,不可以申請退休了!'); --輸出不可退休信息 8 end if; 9 end; 10 /
本例運行結果如圖5.6所示。

圖5.6 IF…THEN…ELSE語句判斷是否可以退休
3.IF…THEN…ELSIF語句
IF…THEN…ELSIF語句實現了多分支判斷選擇,它使程序的判斷選擇條件更加豐富,更加多樣化。該語句中的哪個判斷分支的表達式為true,那么程序就會執行其下面對應的PL/SQL語句,其語法格式如下:
if < condition_expression1 > then plsql_sentence_1; elsif < condition_expression2 > then plsql_sentence_2; … else plsql_sentence_n; end if;
condition_expression1:第一個條件表達式,若其值為false,則程序繼續判斷condition_expression2表達式。
condition_expression2:第二個條件表達式,若其值false,則程序繼續判斷下面的elsif語句后面的表達式;若再沒有“elsif”語句,則程序將執行else語句下面的PL/SQL語句。
plsql_sentence_1:第一個條件表達式的值為true時,要執行的PL/SQL語句。
plsql_sentence_2:第二個條件表達式的值為true時,要執行的PL/SQL語句。
plsql_sentence_n:當其上面所有的條件表達式的值都為false時,要執行的PL/SQL語句。
【例5.13】 指定一個月份數值,然后使用IF…THEN…ELSIF語句判斷它所屬的季節,并輸出季節信息,代碼如下(實例位置:光盤\TM\sl\5\7)。
SQL> set serveroutput on SQL> declare 2 month int:=10; --定義整形變量并賦值 3 begin 4 if month>=0 and month<=3 then --判斷春季 5 dbms_output.put_line(’這是春季’); 6 elsif month>=4 and month<=6 then --判斷夏季 7 dbms_output.put_line(’這是夏季’); 8 elsif month>=7 and month<=9 then --判斷秋季 9 dbms_output.put_line(’這是秋季’); 10 elsif month>=10 and month<=12 then --判斷冬季 11 dbms_output.put_line(’這是冬季’); 12 else 13 dbms_output.put_line(’對不起,月份不合法!'); 14 end if; 15 end; 16 /
本例運行結果如圖5.7所示。

圖5.7 使用if…then…elsif語句判斷季節
注意
在IF…THEN…ELSIF語句中,多個條件表達式之間不能存在邏輯上的沖突,否則程序將判斷出錯!
4.case語句
從Oracle 9i以后,PL/SQL也可以像其他編程語言一樣使用CASE語句,CASE語句的執行方式與IF…THEN…ELSIF語句十分相似。在CASE關鍵字的后面有一個選擇器,它通常是一個變量,程序就從這個選擇器開始執行,接下來是WHEN子句,并且在WHEN關鍵字的后面是一個表達式,程序將根據選擇器的值去匹配每個WHEN子句中的表達式的值,從而實現執行不同的PL/SQL語句的功能,其語法格式如下:
case < selector> when <expression_1> then plsql_sentence_1; when <expression_2> then plsql_sentence_2; … when <expression_n> then plsql_sentence_n; [else plsql_sentence; ] end case;
selector:一個變量,用來存儲要檢測的值,通常稱之為選擇器。該選擇器的值需要與WHEN子句中的表達式的值進行匹配。
expression_1:第一個WHEN子句中的表達式,這種表達式通常是一個常量,當選擇器的值等于該表達式的值時,程序將執行plsql_sentence_1語句。
expression_2:第二個WHEN子句中的表達式,它通常也是一個常量,當選擇器的值等于該表達式的值時,程序將執行plsql_sentence_2語句。
expression_n:第n個WHEN子句中的表達式,它通常也是一個常量,當選擇器的值等于該表達式的值時,程序將執行plsql_sentence_n語句。
plsql_sentence:一個PL/SQL語句,當沒有與選擇器匹配的WHEN常量時,程序將執行該PL/SQL語句,其所在的ELSE語句是一個可選項。
【例5.14】 指定一個季度數值,然后使用CASE語句判斷它所包含的月份信息并輸出,代碼如下(實例位置:光盤\TM\sl\5\8)。
SQL> set serveroutput on SQL> declare 2 season int:=3; --定義整形變量并賦值 3 aboutInfo varchar2(50); --存儲月份信息 4 begin 5 case season --判斷季度 6 when 1 then --若是1季度 7 aboutInfo:=season||’季度包括1,2,3月份’; 8 when 2 then --若是2季度 9 aboutInfo:=season||’季度包括4,5,6月份’; 10 when 3 then --若是3季度 11 aboutInfo:=season||’季度包括7,8,9月份’; 12 when 4 then --若是4季度 13 aboutInfo:=season||’季度包括10,11,12月份’; 14 else --若季度不合法 15 aboutInfo:=season||’季節不合法’; 16 end case; 17 dbms_output.put_line(aboutinfo); --輸出該季度所包含的月份信息 18 end; 19 /
本例運行結果如圖5.8所示。

圖5.8 使用case判斷某個季度所包含的月份
技巧
在進行多種情況判斷時,建議使用CASE語句替換IF…THEN…ELSIF語句,因為CASE語句的語法更加簡潔明了,易于閱讀。
5.3.2 循環語句
當程序需要反復執行某一操作時,就必須使用循環結構。PL/SQL中的循環語句主要包括LOOP語句、WHILE語句和FOR語句3種,本節將對這3種循環語句分別進行介紹。
1.LOOP語句
LOOP語句會先執行一次循環體,然后再判斷“EXIT WHEN”關鍵字后面的條件表達式的值是true還是false,如果是true,則程序會退出循環體,否則程序將再次執行循環體,這樣就使得程序至少能夠執行一次循環體,它的語法格式如下:
loop plsql_sentence; exit when end_condition_ exp end loop;
plsql_sentence:循環體中的PL/SQL語句,可能是一條語句,也可能是多條,這是循環體的核心部分,這些PL/SQL語句至少會被執行一遍。
end_condition_ exp:循環結束條件表達式,當該表達式的值為true時,程序會退出循環體,否則程序將再次執行循環體。
【例5.15】 使用LOOP語句求得前100個自然數的和,并輸出到屏幕,代碼如下(實例位置:光盤\TM\sl\5\9)。
SQL> set serveroutput on SQL> declare 2 sum_i int:=0; --定義整數變量,存儲整數和 3 i int:=0; --定義整數變量,存儲自然數 4 begin 5 loop --循環累加自然數 6 i:=i+1; --得出自然數 7 sum_i:=sum_i+i; --計算前n個自然數的和 8 exit when i=100; --當循環100次時,程序退出循環體 9 end loop; 10 dbms_output.put_line(’前100個自然數的和是:'||sum_i); --計算前100個自然數的和 11 end; 12 /
本例運行結果如圖5.9所示。

圖5.9 求得前100個自然數的和
在上面的代碼中,每一次循環i的值都會自增1,變成一個新的自然數,然后使用sum_i這個變量存儲前n個自然數的和,當i的值為100時,結束循環。
2.WHILE語句
WHILE語句根據它的條件表達式的值執行零次或多次循環體,在每次執行循環體之前,首先要判斷條件表達式的值是否為true,若為true,則程序執行循環體;否則退出WHILE循環,然后繼續執行WHILE語句后面的其他代碼,其語法格式如下。
while condition_expression loop plsql_sentence; end loop;
condition_expression:表示一個條件表達式,當其值為true時,程序執行循環體,否則程序退出循環體,程序每次在執行循環體之前,都要首先判斷該表達式的值是否為true。
plsql_sentence:循環體內的PL/SQL語句。
【例5.16】 使用while語句求得前100個自然數的和,并輸出到屏幕,代碼如下(實例位置:光盤\TM\sl\5\10)。
SQL> set serveroutput on SQL> declare 2 sum_i int:=0; --定義整數變量,存儲整數和 3 i int:=0; --定義整數變量,存儲自然數 4 begin 5 while i<=99 loop --當i的值等于100時,程序退出while循環 6 i:=i+1; --得出自然數 7 sum_i:=sum_i+i; --計算前n個自然數的和 8 end loop; 9 dbms_output.put_line(’前100個自然數的和是:'||sum_i); --計算前100個自然數的和 10 end; 11 /
本例運行效果如圖5.10所示。

圖5.10 求得前100個自然數的和
在上面的代碼中,只要i的值小于100,程序就會反復地執行循環體,這樣i的值就會自增1,從而得到一個新的自然數,然后使用sum_i這個變量存儲前n個自然數的和,當i的值增長到100時,條件表達式的值就為false,導致while循環結束。
3.FOR語句
FOR語句是一個可預置循環次數的循環控制語句,它有一個循環計數器,通常是一個整型變量,通過這個循環計數器來控制循環執行的次數。該計數器可以從小到大進行記錄,也可以相反,從大到小進行記錄。另外,該計數器值的合法性由上限值和下限值控制,若計數器值在上限值和下限值的范圍內,則程序執行循環;否則,終止循環。其語法格式如下。
for variable_ counter_name in [reverse] lower_limit..upper_limit loop plsql_sentence; end loop;
variable_ counter_name:表示一個變量,通常為整數類型,用來作為計數器。默認情況下計數器的值會循環遞增,當在循環中使用REVERSE關鍵字時,計數器的值會隨循環遞減。
lower_limit:計數器的下限值,當計數器的值小于下限值時,程序終止FOR循環。
upper_limit:計數器的上限值,當計數器的值大于上限值時,程序終止FOR循環。
plsql_sentence:表示PL/SQL語句,作為for語句的循環體。
【例5.17】 使用FOR語句求得前100個自然數中偶數之和,并輸出到屏幕,代碼如下(實例位置:光盤\TM\sl\5\11)。
SQL> set serveroutput on SQL> declare 2 sum_i int:=0; --定義整數變量,存儲整數和 3 begin 4 for i in reverse 1..100 loop --遍歷前100個自然數 5 if mod(i,2)=0 then --判斷是否為偶數 6 sum_i:=sum_i+i; - --計算偶數和 7 end if; 8 end loop; 9 dbms_output.put_line(’前100個自然數中偶數之和是:'||sum_i); 10 end; 11 /
本例運行結果如圖5.11所示。

圖5.11 計算前100個自然數中偶數之和
在上面的FOR語句中,由于使用了關鍵字REVERSE,表示計數器i的值為遞減狀態,即i的初始值為100,隨著每次遞減1,最后一次for循環時i的值變為1。如果在for語句中不使用關鍵字REVERSE,則表示計數器i的值為遞增狀態,即i的初始值為1。
4.GOTO語句
GOTO語句的語法是:
GOTO label;
這是個無條件轉向語句。當執行GOTO語句時,控制程序會立即轉到由標簽標識的語句。其中,label是在PL/SQL中定義的符號。標簽使用雙箭頭括號(<< >>)括起來的。
【例5.18】 GOTO語句實例,代碼如下。
… --程序其他部分 <<goto_mark>> --定義了一個轉向標簽goto_mark … --程序其他部分 IF no>98050 THEN GOTO goto_mark; --如果條件成立則轉向goto_mark繼續執行 … --程序其他部分
在使用GOTO語句時需要十分謹慎。不必要的GOTO語句會使程序代碼復雜化,容易出錯,而且難以理解和維護。事實上,幾乎所有使用GOTO的語句都可以使用其他的PL/SQL控制結構(如循環或條件結構)來重新進行編寫。
- 軟件架構設計:大型網站技術架構與業務架構融合之道
- Cocos2d-x游戲開發:手把手教你Lua語言的編程方法
- ASP.NET Core Essentials
- MySQL數據庫管理與開發實踐教程 (清華電腦學堂)
- C++ 從入門到項目實踐(超值版)
- PySpark Cookbook
- Clojure for Java Developers
- 編程改變生活:用Python提升你的能力(進階篇·微課視頻版)
- 從零開始學Android開發
- Unity 5.X從入門到精通
- Applied Deep Learning with Python
- Python數據可視化之matplotlib實踐
- Dart:Scalable Application Development
- Java面試一戰到底(基礎卷)
- Python Natural Language Processing