GOTO語句在PL/SQL中的應用

itpub120發表於2007-03-12
PL/SQL也提供GOTO語句,其語法是
GOTO label;
這裡label是在PL/SQL塊中定義的標籤.標籤是用雙箭頭括號括起來的.當執行GOTO語句的時候,控制會立即轉到由標籤標識的語句.[@more@]

例如,我們可以按照下面的方式實現前面的迴圈示例.
Declare
vn:=1;
begin
loop
insert into temptable
values(vn,'loopcount');
vn := vn + 1;
if vn > 50 then
GOTO nextloop;
end if;
end loop;
<>
insert into temptable(char_col)
values('done!');
end;
一:對於GOTO的限制
1:PL/SQL對於GOTO的使用有一些限制.對於塊,迴圈或者IF語句而言,想要從外層跳轉到內層是非法的.下面就是一個非法的例子.
BEGIN
GOTO 1_innerBlock;
BEGIN
......
<<1_innerBlock;>>
......
END;
GOTO 1_INSIDEIF;
if x > 3 then
...
<<1_INSIDEIF>>
insert into ....
end if;
end if;
如果這樣的寫法是合法的,那麼甚至儘管IF條件沒有求值為TRUE,IF語句中的語句也將被執行.在前面的例子中,當X =2 時,INSERT 語句可能要被執行.

2:使用GOTO語句從一個IF子句跳轉到另一個子句中也是非法的.
BEGIN
IF X >3 THEN
...
GOTO 1_nextcondition;
ELSE
<<1_nextcondition>>
....
END IF;
END;

3:最後,從一個異常處理塊內部跳轉到當前塊是非法的.
begin
<<1_insert>>
insert into....;
exception when others then
GOTO 1_insert;
end;
二.為迴圈設定標籤
迴圈本身是可以被設計標籤的.如果進行了設定,那麼可以在EXIT語句中使用該標籤指明要退出哪個迴圈.例如:
<<1_outer>>
for v_outerindex in 1..50 loop
...
<<1_inner>>
for v_innerindex in 2..10 loop
...
if v_outerindex > 40 then
exit 1_outer;
end if;
end loop 1_inner;
end loop 1_outer;
如果為迴圈設定了標籤,那麼可以在END LOOP 語句的後面包含該標籤名,正如上面的例子中所示的那樣.
三.GOTO語句的使用指南
在使用GOTO的時候請一定小心.不必要的GOTO語句會產生出"通心粉程式碼",這是一些無目的的跳來跳去的程式碼,很難理解和進行維護.
幾乎所有使用GOTO的情況都可以使用其他的PL/SQL控制結構,例如迴圈或者條件結構,來重新進行編寫.也可以使用異常處理來退出
深層巢狀的迴圈,而不用直接跳轉到結尾.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8109090/viewspace-904114/,如需轉載,請註明出處,否則將追究法律責任。

相關文章