2008-05-28

PL/SQL 的迴圈介紹 (Loops with PL/SQL)

阿布洛格 Oracle在很多情況下,跟其他程式語言一樣,在 PL/SQL 中我們也需要迴圈來反覆地執行某些動作。就來介紹一下,在 PL/SQL 中的迴圈種類以及如何去控制迴圈吧!

迴圈的種類:
a. 基本迴圈:
LOOP
/* statements */
END LOOP;

b. WHILE 迴圈:
WHILE i > j
LOOP
/* statements */
END LOOP;

c. FOR 迴圈:
用數字指定執行迴圈數:
FOR i IN 1..10
LOOP
DBMS_OUTPUT.put_line('i = ' || i);
END LOOP;

可以倒著跑:
FOR i IN REVERSE 1..10
LOOP
DBMS_OUTPUT.put_line('i = ' || i);
END LOOP;

跟著 CURSOR 的應用:
FOR rec IN (SELECT col1, col2 FROM table_name)
LOOP
DBMS_OUTPUT.put_line('rec.col1 = ' || rec.col1 ||
'rec.col2 = ' || rec.col2);
END LOOP;

FOR rec IN cursor_name
LOOP
DBMS_OUTPUT.put_line('rec.col1 = ' || rec.col1 ||
'rec.col2 = ' || rec.col2);
END LOOP;

FOR rec IN cursor_name(param1, param2...)
LOOP
DBMS_OUTPUT.put_line('rec.col1 = ' || rec.col1 ||
'rec.col2 = ' || rec.col2);
END LOOP;


迴圈的控制: 標籤(LABEL)與跳出(EXIT)的應用
可以用標籤 (LABEL) 來為迴圈命名:
<<label_name>>
FOR i IN 1..9
LOOP
DBMS_OUTPUT.put_line(i);
END LOOP label_name;

再來看看跳出(EXIT)的使用:
EXIT;
EXIT WHEN i > j;
EXIT label_name;
EXIT label_name WHEN i > j;

把它們湊在一起, 來完成迴圏的控制吧:
BEGIN
<<i_loop>>
FOR i IN 1..9
LOOP
<<j_loop>>
FOR j IN 1..9 LOOP
DBMS_OUTPUT.put(j);
END LOOP j_loop;
DBMS_OUTPUT.new_line;
END LOOP i_loop;
/**
輸出結果為:
123456789
123456789
123456789
123456789
123456789
123456789
123456789
123456789
123456789
*/

<<i_loop>>
FOR i IN 1..9
LOOP
<<j_loop>>
FOR j IN 1..9 LOOP
DBMS_OUTPUT.put(j);
EXIT j_loop WHEN j = i;
END LOOP j_loop;
DBMS_OUTPUT.new_line;
END LOOP i_loop;
/**
輸出結果為:
1
12
123
1234
12345
123456
1234567
12345678
123456789
*/
END;

在每一種程式語言中,迴圈的寫法與控制,就像變數宣告、運算子、判斷式等等一樣,是基礎的馬步。可是迴圈的控制與寫作,會多了那麼點效能的議題。多重迴圏更考驗著程式人員邏輯與思路的清晰。多用點心思,可以減少某些跑起來很囧的迴圈的出現,就更不用說比囧還囧的無窮迴圈了…

謎之音:比囧還囧,那不就是莔嘞?(笑)

0 回應 :

張貼留言

讓阿布知道你對這篇文章的想法吧!