真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

9.PL_SQL——PL_SQL中的循環(huán)控制語句

循環(huán)是指在程序中重復(fù)執(zhí)行一條或多條語句、PL/SQL中的循環(huán)主要有三種:

在曹縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站制作,曹縣網(wǎng)站建設(shè)費(fèi)用合理。

                              1.Basic Loop

                              2. FORLoop

                              3.WHILE Loop

 

下面來逐一介紹這三種循環(huán)的用法。

 

一、BasicLoops

        基本循環(huán)的格式如下:

             

              LOOP

                              statement1;

                              ...

                              EXIT [WHENcondition];

              END LOOP;

             

        這里的EXIT是用來退出循環(huán)的,如果沒有EXIT,則會變成死循環(huán)。

 

       下面來看一個(gè)小例子:

 

SQL>select location_id, city, country_id fromlocations where country_id = 'CA';

 
LOCATION_ID CITY                    CO
----------- ------------------------------ 
       1800 Toronto                 CA
       1900 Whitehorse              CA
-- 目前有兩條記錄

 

SQL>edit 

DECLARE
        v_countryid     locations.country_id%TYPE :='CA';
        v_loc_id        locations.location_id%TYPE;
        v_counter       NUMBER(2) := 1;
        v_new_city      locations.city%TYPE := 'Montreal';
BEGIN
        SELECT MAX(location_id)
        INTO v_loc_id
        FROM locations
        WHERE country_id =v_countryid;
 
        LOOP
            INSERT INTOlocations(location_id, city, country_id)
            VALUES((v_loc_id +v_counter), v_new_city, v_countryid);
            v_counter := v_counter+ 1;
            EXIT WHEN v_counter> 3;
           -- EXIT后面可以加上標(biāo)簽,來指定退出哪一層循環(huán)
        END LOOP;
 
        COMMIT;
END;
/

 

SQL>/ 

PL/SQL procedure successfully completed.

 

SQL>select location_id, city, country_id from locations where country_id = 'CA'; 

LOCATION_ID CITY                           CO
----------- ------------------------------ --
       1800 Toronto                        CA
       1900 Whitehorse                     CA
       1901 Montreal                       CA
       1902 Montreal                       CA
       1903 Montreal                       CA            
-- 執(zhí)行了循環(huán)語句后,多了三條記錄

 

                

二、WHILE循環(huán)

         WHILE循環(huán)的格式如下:

 

              WHILE condition LOOP

                              statement1;

                              statement2;

                              ...

              END LOOP;

 

         WHILE循環(huán)是指當(dāng)condition的結(jié)果為TRUE時(shí),就執(zhí)行循環(huán)體。它的循環(huán)體可以執(zhí)行0次或多次,比較適用于循環(huán)次數(shù)不確定的情況。當(dāng)條件不滿足,就會自動退出循環(huán)。

         現(xiàn)在使用WHILE循環(huán)來改寫之前的例子:

 

SQL>edit 

 DECLARE
        v_countryid     locations.country_id%TYPE :='CA';
        v_loc_id        locations.location_id%TYPE;
        v_counter       NUMBER(2) := 1;
        v_new_city      locations.city%TYPE := 'Montreal';
BEGIN
        SELECT MAX(location_id)
        INTO v_loc_id
        FROM locations
        WHERE country_id =v_countryid;
 
        WHILE v_counter <= 3
              -- 使用WHILE,當(dāng)v_counter小于等于3時(shí)就執(zhí)行下面的語句
        LOOP
            INSERT INTOlocations(location_id, city, country_id)
            VALUES((v_loc_id +v_counter), v_new_city, v_countryid);
            v_counter := v_counter+ 1;
        END LOOP;
              -- 沒有循環(huán)出口EXIT,當(dāng)v_counter大于3時(shí)會自動退出循環(huán)
        COMMIT;
END;
/

                               

SQL>/  

PL/SQL procedure successfully completed.

 

SQL>select location_id, city, country_id from locations where country_id = 'CA';

 

LOCATION_ID CITY                          CO

----------- ------------------------------ --

       1800 Toronto                        CA

       1900 Whitehorse                  CA

       1901 Montreal                       CA

       1902 Montreal                       CA

       1903 Montreal                       CA

       1904 Montreal                       CA

       1905 Montreal                       CA

       1906 Montreal                       CA

 

8 rows selected.

--又多了三條記錄

 

        如果條件一次都不滿足,WHILE循環(huán)會出現(xiàn)一次都不執(zhí)行的情況。

 

三、FOR循環(huán)

 

         FOR循環(huán)的基本格式為:

 

FORcounter IN [REVERSE]

             -- REVERSE是關(guān)鍵字,表示反過來循環(huán),如從10到1進(jìn)行循環(huán)

               lower_bound..upper_bound LOOP

               --分別是下邊界和上邊界,變量counter和上下邊界都必須是數(shù)值型

              statement1;

              statement2;

              ...

ENDLOOP;

 

          FOR循環(huán)多用于循環(huán)次數(shù)已知的情況,F(xiàn)OR循環(huán)不需要專門聲明一個(gè)變量作為計(jì)數(shù)器。它的計(jì)數(shù)器出了FOR循環(huán)之后是不可以使用的,如果一定要使用,建議還是專門聲明一個(gè)計(jì)數(shù)器。和其他語言的FOR循環(huán)不同的是,用戶不能自定義步長,如果想自定義步長,可以用基本循環(huán)或WHILE循環(huán)代替。

         下面用FOR循環(huán)來改寫之前的例子:

 

SQL>edit

DECLARE
        v_countryid     locations.country_id%TYPE :='CA';
        v_loc_id        locations.location_id%TYPE;
        v_new_city      locations.city%TYPE := 'Montreal';
BEGIN
        SELECT MAX(location_id)
        INTO v_loc_id
        FROM locations
        WHERE country_id =v_countryid;
 
        FOR i IN 1..3
          -- 這里的i不需要在DECLARE部分專門聲明,1和3分別是這個(gè)循環(huán)的下邊界和上邊界
          --FOR循環(huán)的步長是固定的,不能自行定義
        LOOP
            INSERT INTOlocations(location_id, city, country_id)
            VALUES((v_loc_id + i),v_new_city, v_countryid);
        END LOOP;
      --  DBMS_OUTPUT.PUT_LINE('The counter is ' || i);
          -- 第一次執(zhí)行先打開注解,用來驗(yàn)證計(jì)數(shù)器出了循環(huán)之后的情況。
        COMMIT;
END;
/

 

SQL>/

*
ERROR at line 16:
ORA-06550: line 16, column 44:
PLS-00201: identifier 'I' must be declared
ORA-06550: line 16, column 2:
PL/SQL: Statement ignored
-- 報(bào)錯(cuò)是因?yàn)橛?jì)數(shù)器i沒有聲明,因此出了FOR循環(huán)就不能使用了。

 

SQL>/

PL/SQL procedure successfully completed.

 

SQL>select location_id, city, country_id from locations where country_id = 'CA';

 

LOCATION_ID CITY                           CO
----------- ------------------------------ --
       1800 Toronto                        CA
       1900 Whitehorse                     CA
       1901 Montreal                       CA
       1902 Montreal                       CA
       1903 Montreal                       CA
       1904 Montreal                       CA
       1905 Montreal                       CA
       1906 Montreal                       CA
       1907 Montreal                       CA
       1908 Montreal                       CA
       1909 Montreal                       CA
 
11 rows selected.
-- 又多了三條記錄

 

      FOR循環(huán)是比較受歡迎一種循環(huán),因?yàn)樗难h(huán)次數(shù)可控,不過使用FOR循環(huán),需要注意一些基本的規(guī)則:

 

A. 計(jì)數(shù)器counter只能在循環(huán)內(nèi)部引用,它不需要在循環(huán)外部定義;

             

B. 不要為計(jì)數(shù)器counter賦值,它的賦值是自動完成的,但是可以將計(jì)數(shù)器的值賦值給其他變量;

             

C. 不要使用NULL值作為循環(huán)次數(shù)的下界和上界;

             

D. 下界和上界可以為非整數(shù),但非整數(shù)會被自動計(jì)算為整數(shù);

             

E. 加了關(guān)鍵字REVERSE之后表示循環(huán)的次數(shù)為倒序,即從上界向下界執(zhí)行,但是即使使用了REVERSE,下界的值仍然應(yīng)該比上界的值小,下面舉個(gè)例子來演示REVERSE的用法:

             

          SQL> edit

                             

    BEGIN
         DBMS_OUTPUT.PUT_LINE('--------Normal--------');
         FORi IN 1..3
         -- 正常順序
         LOOP
             DBMS_OUTPUT.PUT_LINE('Outputis ' || i);
         ENDLOOP;
               
         DBMS_OUTPUT.PUT_LINE('------Reverse-------');
         FORi IN REVERSE 1..3
         -- 加了關(guān)鍵字REVERSE會逆序執(zhí)行
         LOOP
             DBMS_OUTPUT.PUT_LINE('Outputis ' || i);
         END LOOP;
               
         DBMS_OUTPUT.PUT_LINE('-----Upperand Lower------');
         FORi IN REVERSE 3..1
         -- 雖然使用了REVERSE關(guān)鍵字,但是下邊界比上邊界大,會出現(xiàn)不可控的現(xiàn)象
         LOOP
             DBMS_OUTPUT.PUT_LINE('Outputis ' || i);
         END LOOP;
     END;
     /

 

 SQL> /

             

--------Normal--------
Output is 1
Output is 2
Output is 3
------Reverse-------
Output is 3
Output is 2
Output is 1
-----Upper andLower------
--這一段沒有執(zhí)行,因?yàn)橄陆绱笥谏辖纾瑫徽J(rèn)為結(jié)果為FALSE,故不進(jìn)循環(huán)體。
               
PL/SQL proceduresuccessfully completed.

 

四、循環(huán)種類的選擇

 

        循環(huán)種類的選擇應(yīng)根據(jù)實(shí)際需要,這里僅提供一些基本的建議:

1. 循環(huán)體必須至少執(zhí)行一次,建議使用Basic LOOP;

2. 先對條件進(jìn)行判斷,以決定循環(huán)體執(zhí)行0次或多次,尤其是循環(huán)次數(shù)不確定的情況,建議使用WHILE循環(huán);

3. 循環(huán)次數(shù)已知,建議使用FOR循環(huán)。

             

五、循環(huán)的嵌套

         循環(huán)可以嵌套,但注意嵌套的次數(shù)不要過多,最好不要超過3層;使用標(biāo)簽來區(qū)分代碼塊和循環(huán)體是個(gè)不錯(cuò)的編程習(xí)慣;EXIT結(jié)合標(biāo)簽使用,可以指定當(dāng)前循環(huán)退出到哪一層循環(huán),下面來看一個(gè)小例子:

9.PL_SQL——PL_SQL中的循環(huán)控制語句

六、CONTITUE關(guān)鍵字

        CONTITUE是ORACLE11g中引入的概念,如果數(shù)據(jù)庫的版本是11g以前的,則不能用CONTINUE。

CONTITUE的用法為:

              1. 跳過當(dāng)前語句,但不退出循環(huán),直接進(jìn)入下一輪循環(huán);

              2. 它的句法和EXIT一樣,可以使用

                              a. CONTINUE;

                                   --不附加條件

                              b.CONTINUE WHEN condition;

                                  --附加條件

                              c.CONTINUE label;

                                  --跳轉(zhuǎn)到某一個(gè)標(biāo)簽

                             

         在11g以前如果要實(shí)現(xiàn)CONTINUE的功能,需要寫更為復(fù)雜的程序,引入CONTINUE可以的簡化程序,提高性能。下面來看一個(gè)CONTINUE的例子:

             

SQL>edit

             

DECLARE
        v_total SIMPLE_INTEGER :=0;
BEGIN
        FOR i IN 1..10 LOOP
            v_total := v_total + i;
           DBMS_OUTPUT.PUT_LINE('Total is: ' || v_total);
 
            CONTINUE WHEN i > 5;
              --當(dāng)i大于5使,跳出當(dāng)前這一輪循環(huán),進(jìn)入下一輪循環(huán)
            v_total := v_total + i;
           DBMS_OUTPUT.PUT_LINE('Out of Loop Total is' || v_total);
        END LOOP;
END;
/

               

SQL>/

Total is: 1
Out of Loop Total is2
Total is: 4
Out of Loop Total is6
Total is: 9
Out of Loop Total is12
Total is: 16
Out of Loop Total is20
Total is: 25
Out of Loop Total is30
-- i 大于5時(shí)跳出當(dāng)前這一輪循環(huán)
Total is: 36
Total is: 43
Total is: 51
Total is: 60
Total is: 70
 
PL/SQL procedure successfully completed.

 

再來看一個(gè)CONTINUE和標(biāo)簽結(jié)合使用的例子:

 

SQL>edit

DECLARE
       v_total NUMBER := 0;
BEGIN
       <>
      FOR i IN 1..10 LOOP
        v_total := v_total+ 1;
        DBMS_OUTPUT.PUT_LINE('---BeforeTopLoop---Total is: ' || v_total);
 
        FOR j IN 1..10 LOOP
          CONTINUE BeforeTopLoop WHEN i + j > 5;
          -- 跳轉(zhuǎn)到標(biāo)簽BeforeTopLoop處
          v_total :=v_total + 1;
          DBMS_OUTPUT.PUT_LINE('---AfterTopLoop---Total is: ' || v_total);
        END LOOP;
      END LOOP;
END;

 

SQL>/

---BeforeTopLoop---Total is: 1
---AfterTopLoop---Total is: 2
---AfterTopLoop---Total is: 3
---AfterTopLoop---Total is: 4
---AfterTopLoop---Total is: 5
---BeforeTopLoop---Total is: 6
---AfterTopLoop---Total is: 7
---AfterTopLoop---Total is: 8
---AfterTopLoop---Total is: 9
---BeforeTopLoop---Total is: 10
---AfterTopLoop---Total is: 11
---AfterTopLoop---Total is: 12
---BeforeTopLoop---Total is: 13
---AfterTopLoop---Total is: 14
---BeforeTopLoop---Total is: 15
---BeforeTopLoop---Total is: 16
---BeforeTopLoop---Total is: 17
---BeforeTopLoop---Total is: 18
---BeforeTopLoop---Total is: 19
---BeforeTopLoop---Total is: 20
 
PL/SQL procedure successfully completed.

再來看一個(gè)使用CONTINUE從內(nèi)層循環(huán)跳轉(zhuǎn)到外層循環(huán)的例子:

 

SQL>edit

BEGIN
        <>
        FOR i IN 1..5
        LOOP
            DBMS_OUTPUT.PUT_LINE('Outer index = '|| TO_CHAR(i));
 
            <>
            FOR j IN 1..5
            
            LOOP
              DBMS_OUTPUT.PUT_LINE('--->Inner index = ' || TO_CHAR(j));
              -- 這條語句不會執(zhí)行5次,因?yàn)槊看螆?zhí)行后就會跳出這一層循環(huán)
              CONTINUE outer;
              
            END LOOP inner;
        END LOOP outer;
END;

 

SQL>/

Outer index = 1
--->Inner index = 1
Outer index = 2
--->Inner index = 1
Outer index = 3
--->Inner index = 1
Outer index = 4
--->Inner index = 1
Outer index = 5
--->Inner index = 1
 
PL/SQL procedure successfully completed.

             

六、GOTO語句

          CONTINUE加上標(biāo)簽一起使用,和GOTO語句比較相似。GOTO語句可以無條件跳轉(zhuǎn)到另一個(gè)代碼塊,但該代碼塊必須和跳轉(zhuǎn)前的代碼塊處于同一可執(zhí)行的section(如BEGIN或EXCEPTION部分)中。在實(shí)際編程中不建議使用GOTO,因?yàn)樗恍枰獥l件控制,容易破壞程序的可讀性。

下面來看一個(gè)GOTO語句的例子:

 

SQL>edit         

BEGIN
    GOTO second_output;
              --直接跳轉(zhuǎn)到標(biāo)簽所在的位置,下面這條語句永遠(yuǎn)都不是執(zhí)行
    DBMS_OUTPUT.PUT_LINE('This linewill never execute.');
    <>
    DBMS_OUTPUT.PUT_LINE('We arehere!');
END;
/

SQL>/

We are here!
PL/SQL procedure successfully completed.

 

GOTO語句使用時(shí)最好加上IF語句設(shè)定跳轉(zhuǎn)的條件。


網(wǎng)頁名稱:9.PL_SQL——PL_SQL中的循環(huán)控制語句
標(biāo)題鏈接:http://weahome.cn/article/gcsijs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部