ORACLE PL/SQL練習(六)

PL/SQL循環結構ide


PL/SQL提供了3種不一樣類型的循環結構:測試


簡單循環或者無限循環;ip


FOR循環(數值循環或者遊標循環);ci


WHILE循環。it


循環屬性:table

                 屬性                  說明
循環如何結束 循環即反覆地執行代碼,該如何讓循環結束執行呢?
何時測試是否該結束循環 這個結束測試是在循環一開始就作呢,仍是在循環的末尾進行?各自的後果是什麼?
採用這種循環的緣由 是什麼因素促使你考慮選擇了某種循環?

                                        

                          

            

簡單循環:以LOOP關鍵字開始,以END LOOP關鍵字結束。要考循環體內的EXIT,EXIT WHEN或者RETURN來退出循環(或者有異常拋出)。class


CREATE OR REPLACE PROCEDURE display_multiple_years (循環

   start_year_in IN PLS_INTEGERim

 , end_year_in   IN PLS_INTEGER異常

)

IS

   l_current_year   PLS_INTEGER := start_year_in;

BEGIN

   LOOP

      EXIT WHEN l_current_year > end_year_in;

      display_total_sales (l_current_year);

      l_current_year := l_current_year + 1;

   END LOOP;

END display_multiple_years;


FOR循環

Oracle提供了數值型和遊標型的FOR循環,要使用數值型FOR循環,需指定循環開始的整數值和結束整數值。

PL/SQL會完成剩下的工做,迭代每個中間取值,而後結束循環。


DROP TABLE sales_data

/


CREATE TABLE sales_data (year INTEGER, sales_amount NUMBER)

/


CREATE OR REPLACE PROCEDURE display_total_sales (year_in IN PLS_INTEGER)

IS

BEGIN

   DBMS_OUTPUT.put_line ('Total for year ' || year_in);

END display_total_sales;

/


CREATE OR REPLACE PROCEDURE display_multiple_years (

   start_year_in IN PLS_INTEGER

 , end_year_in   IN PLS_INTEGER

)

IS

   l_current_year   PLS_INTEGER := start_year_in;

BEGIN

   LOOP

      EXIT WHEN l_current_year > end_year_in;

      display_total_sales (l_current_year);

      l_current_year := l_current_year + 1;

   END LOOP;

END display_multiple_years;

/


CREATE OR REPLACE PROCEDURE display_multiple_years (

   start_year_in IN PLS_INTEGER

 , end_year_in   IN PLS_INTEGER

)

IS

BEGIN

   FOR l_current_year IN start_year_in .. end_year_in

   LOOP

      display_total_sales (l_current_year);

   END LOOP;

END display_multiple_years;


遊標型的FOR循環使用相通的基本結構,但須要提供一個明確地遊標或者SELECT語句,而不是數值型FOR循環使用的整數的上下邊界。


CREATE OR REPLACE PROCEDURE display_multiple_years (

   start_year_in IN PLS_INTEGER

 , end_year_in   IN PLS_INTEGER

)

IS

BEGIN

   FOR l_current_year IN (SELECT *

                            FROM sales_data

                           WHERE year BETWEEN start_year_in AND end_year_in)

   LOOP

      -- This procedure is now accepted a record implicitly declared

      -- to be of type sales_data%ROWTYPE...

      display_total_sales (l_current_year.year);

   END LOOP;

END display_multiple_years;


WHILE循環

WHILE循環和簡單循環很是類似,一個關鍵的區別在於WHILE循環會在每次循環以前檢查是否知足終止條件,循環體內的代碼有可能一次也不會執行。


CREATE OR REPLACE PROCEDURE display_multiple_years (

   start_year_in IN PLS_INTEGER

 , end_year_in   IN PLS_INTEGER

)

IS

   l_current_year   PLS_INTEGER := start_year_in;

BEGIN

   WHILE (l_current_year <= end_year_in)

   LOOP

      display_total_sales (l_current_year);

      l_current_year := l_current_year + 1;

   END LOOP;

END display_multiple_years;


每一個循環結構都包括兩部分:循環邊界和循環體


循環邊界由一些保留字組成,包括初始化循環,終止循環的條件,終止循環的END LOOP語句。


循環體:這是一系列的位於循環邊界內的可執行語句,這些語句在每一次循環內都要執行。

相關文章
相關標籤/搜索