程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> PL/SQL編程_流控制,plsql編程

PL/SQL編程_流控制,plsql編程

編輯:Oracle教程

PL/SQL編程_流控制,plsql編程


PL/SQL提供了豐富的流控制語句,用來對程序的執行流程進行控制

通過流控制語句,我們可以編寫更復雜的PL/SQL塊。

流控制語句分為兩類,即條件判斷語句循環語句

IF語句

IF語句是一種條件判斷語句,它根據條件判斷的結果執行不同的代碼。

最簡單的IF語句格式為:

IF 條件 THEN

  代碼

END IF;

如果條件成立,就執行指定的代碼,否則執行IF語句後面的代碼。

如果還要求在條件不成立時執行另外的代碼,則可以使用下面的形式:

IF 條件 THEN

  代碼1

ELSE

  代碼2

END IF;

那麼當條件成立時執行代碼l ,條件不成立時執行代碼2 。
在更復雜的情況下,要先後判斷多個條件,這時要用到下面的形式:

IF 條件1 THEN

  代碼1

ELSIF 條件2 THEN

  代碼2

...

ELSE 

  代碼n

END IF;

在執行上面的IF語句時,首先判斷條件l 。

當條件l 成立時執行代碼l ,否則繼續判斷條件2,如果成立則執行代碼2 ,否則繼續判斷下面的條件。
如果前面的條件都不成立,則執行ELSE後面的代碼n 。
上面提到的IF形式每次只進行一個條件的判斷,如果這個條件成立,則執行相應的代碼,否則繼續判斷下面的條件。
有時候需要一次判斷多個條件,根據多個條件的綜合情況執行相應的代碼,這就要用到條件的聯合。
條件的聯合有“與”和“或”兩種形式。

“與”運算通過AND運算符連接多個條件,只有當所有條件都成立時,整個條件判斷才算成立。
如果有一個條件不成立,則整個條件判斷不成立。
“與”運算的格式為

條件1 AND 條件2 AND 條件3 ...

例如,要計算1+2+3 +…+ 100的值,當和大於500時停止,求正好使和大於500 的最後一個整數。
這時可以構造兩個條件,其中一個條件要求求和的數據小於等於100 ,另一個條件要求求和的結果小於等於500 ,只要這兩個條件同時滿足,就可以繼續求和。
只要其中一個條件不滿足,則求和停止。
用於求和的PL/SQL塊的代碼如下所示。

在塊中用到了LOOP循環。

DECLARE
i INTEGER:=0;
total INTEGER:=0;
BEGIN
LOOP
IF i<=100 and total<=500 THEN --如果兩個條件都滿足,則繼續循環
i:=i+1;
total:=total+i;
ELSE --只要一個條件不滿足,則退出循環,計算結束
EXIT;
END IF;
END LOOP;
dbms_output.put_line(i);
END;

LOOP語句

LOOP是一種循環語句,它使一部分代碼反復執行。

LOOP語句的基本格式為:

LOOP

  循環體

END LOOP;

如果不做特殊處理, LOOP中的代碼將無限制地執行。

一般可以用EXIT WHEN或者EXIT語句結束LOOP循環。
EXIT WHEN指定一個條件,當條件滿足時退出循環。

EXIT語句使循環結束,一般與IF語句結合使用。
例如,要計算1+2+3+…的值,當和大於500時停止,求正好使
和大於500的最後一個整數,代碼如下:

DECLARE
i INTEGER:=0;
total INTEGER:=0;
BEGIN
LOOP
i:=i+1;
total:=total+i;
EXIT WHEN total > 500;
END loop;
dbms_output.put_line(i);
END;

在上述例子中,語句EXIT WHEN total > 500使得當求和結果大於500時停止循環。

這條語句可以用EXIT語句代替,這時需要用IF語句判斷和是否大於500:
IF total>500 THEN
EXIT;
END IF;

WHILE 語句 

WHILE語句的功能是根據條件判斷的結果循環執行一部分代碼,只要條件成立,則反復執行這段代碼。

WHILE語句的格式為:

WHILE 條件 LOOP

循環體

END LOOP;

在執行WHILE循環時,首先判斷條件是否成立,如果成立,則執行循環體。

然後再判斷條件,如果條件成立,接著執行循環體,直到條件不成立時,循環結束。
例如,下面的代碼用來求表達式1+2+3+···+100的值。

DECLARE
i INTEGER := 1;
total INTEGER:=0;
BEGIN
while i<=100 LOOP
total:=total+i;
i:=i+1;
END LOOP;
dbms_output.put_line(total);
end;

注:上面是使用WHILE 條件 LOOP 語句,轉換為 LOOP IF 條件 THEN 語句寫法如下:

loop
if i<=100 then
total:=total+i;
i:=i+1;
else
exit;
end if;
end loop;

通過上面兩種實現方法的對比,可以發現:

WHILE 語句沒有結束判斷的語句,沒有顯式指定退出循環的條件。

下面是使用EXIT WHEN語句退出循環體。
DECLARE
i INTEGER := 1;
total INTEGER:=0;
BEGIN
loop
if i<=100 then
total:=total+i;
i:=i+1;
end if;
exit when i >100;
end loop;
dbms_output.put_line(total);
end;

FOR 語句

FOR語句的功能是指定一個起始值,一個終止值在這個范圍內反復執行一段代碼,並由一個循環變量控制循環的執行
循環變量從起始值開始,每執行一次循環,循環變量自動加1或減1 ,直到與終止值相等時,循環結束。
FOR語句的格式為:

FOR 循環變量 IN [REVERSE ]起始值 ..終止值 LOOP
循環體
END LOOP

注:關鍵字REVERSE 是反向操作。

在FOR語句中,在IN的後面,從起始值開始到終止值之間的整數構成一個集合,集合中的元素依次加1 。
在執行FOR語句時,循環變量先取集合中的第一個元素,執行一次循環體,然後依次取集合中的每個元素,分別執行一次循環體,直到把集合中的元素都取一次。
如果使用REVERSE ,則按照相反的順序取集合中的元素,即先取最後一個元素,然後依次取前面的元素,直到第一個元素。
例如,上述求表達式1+2+3 +…+ 100的代碼可以改用FOR語句實現,代碼如下:

DECLARE
total INTEGER:=0;
BEGIN
for i in 1 .. 100 LOOP
total:=total+i;
END LOOP;
dbms_output.put_line(total);
end;

從上面的例子可以看出,在FOR循環中,循環變量不需要定義也不需要顯式地將集合中的元素賦給它也不需要進行條件判斷,所以用FOR語句編寫的代碼比較簡潔。

需要注意的是,循環變量只能在FOR循環內使用。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved