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循環內使用。