官术网_书友最值得收藏!

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控制結構(如循環或條件結構)來重新進行編寫。

主站蜘蛛池模板: 都江堰市| 小金县| 永顺县| 清河县| 健康| 香格里拉县| 天气| 西乌| 贵州省| 谷城县| 南澳县| 门源| 金川县| 南平市| 浙江省| 项城市| 大丰市| 馆陶县| 招远市| 抚远县| 蒙自县| 汶上县| 子长县| 普宁市| 曲周县| 枣阳市| 天峨县| 杭锦旗| 原阳县| 佛山市| 加查县| 健康| 闸北区| 石门县| 湾仔区| 会昌县| 河池市| 北碚区| 皮山县| 遵化市| 通州区|