在Programming界中有一句話深刻的描述了程式語言的特性:
"不論使用哪一種程式語言,只要你會IF ELSE與WHILE就能打遍天下",
這句話完完全全的說明了其實寫程式並不難,
回到本文,
前面講解了PL/SQL的程式架構,
接著要來介紹PL/SQL中程式語言最基本的邏輯語法 - 判斷式與迴圈。
程式根據所設置的條件來選擇執行哪一個分支,
以下是PL/SQL中IF ELSE的程式架構:
IF condition1
THEN
statements
[ ELSIF condition2
THEN
statments ]
[ ELSE
last_statements ]
END IF;
這裡較特別的是condition後面要加上THEN,
ELSE後面則不用加THEN,
整個IF ELSE區塊要以END IF作為結束,
以下為IF ELSE範例程式:
switch case為if else的變形,
其實switch case可以直接用if else進行實作,
但是會較複雜,
而case還分為兩種形式,
simple與searched CASE statement,
以下為PL/SQL中simple CASE的程式架構:
CASE selector
WHEN expression1 THEN statements
[ WHEN expression2 THEN statements ]
....
[ ELSE statements ]
END CASE;
simple case statement主要是以selector的值作為選擇對象,
expression作為selector值的選擇分支。
simple CASE範例程式碼:
接著我們來看searched CASE的程式架構:
CASE
WHEN condition1 THEN statements
[ WHEN condition2 THEN statements ]
....
[ ELSE statements ]
END CASE;
searched CASE與simple CASE的差異在於searched使用condition替代expression,
使用condition就能變得較彈性,
但要控制好condition之間的互斥。
searched CASE範例程式碼:
可以使用for loop,
以下為FOR LOOP程式架構:
FOR loop_counter IN [ REVERSE ] lower_bound .. upper_bound
LOOP
statements
END LOOP;
這裡要注意的是進行動作的statement區塊要放置於LOOP與END LOOP中,
如果有REVERSE關鍵字出現,
迴圈就會從upper_bound開始遞減執行至lower_bound。
FOR LOOP範例程式碼:
輸出結果:1 2 3 4 5 6 7 8 9 10
從上面FOR LOOP來看,
我們可以發現FOR LOOP程式架構中包含了Simple Loop,
Simple Loop本身是個無窮迴圈,
需要加上停止條件才能夠跳出,
以下為Simple Loop的程式碼架構:
LOOP
statements
EXIT WHEN condition;
END LOOP;
當condition條件成立時會跳出LOOP。
LOOP範例程式碼:
輸出結果:1 2 3 4 5 6 7 8 9
"不論使用哪一種程式語言,只要你會IF ELSE與WHILE就能打遍天下",
這句話完完全全的說明了其實寫程式並不難,
回到本文,
前面講解了PL/SQL的程式架構,
接著要來介紹PL/SQL中程式語言最基本的邏輯語法 - 判斷式與迴圈。
IF ELSE
if else是最基本也是最常用的邏輯判斷式,程式根據所設置的條件來選擇執行哪一個分支,
以下是PL/SQL中IF ELSE的程式架構:
IF condition1
THEN
statements
[ ELSIF condition2
THEN
statments ]
[ ELSE
last_statements ]
END IF;
這裡較特別的是condition後面要加上THEN,
ELSE後面則不用加THEN,
整個IF ELSE區塊要以END IF作為結束,
以下為IF ELSE範例程式:
DECLARE A VARCHAR2(1) := 'N'; BEGIN IF A = 'Y' THEN DBMS_OUTPUT.PUT_LINE('YES'); ELSIF A = 'N' THEN DBMS_OUTPUT.PUT_LINE('NO'); ELSE DBMS_OUTPUT.PUT_LINE('UNKNOW'); END IF; END;
CASE
case也就是程式語言中的switch case,switch case為if else的變形,
其實switch case可以直接用if else進行實作,
但是會較複雜,
而case還分為兩種形式,
simple與searched CASE statement,
以下為PL/SQL中simple CASE的程式架構:
CASE selector
WHEN expression1 THEN statements
[ WHEN expression2 THEN statements ]
....
[ ELSE statements ]
END CASE;
simple case statement主要是以selector的值作為選擇對象,
expression作為selector值的選擇分支。
simple CASE範例程式碼:
DECLARE grade VARCHAR2(1) := 'A'; BEGIN CASE grade WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('EXCELLENT'); WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('VERY GOOD'); WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('GOOD'); ELSE DBMS_OUTPUT.PUT_LINE('UNKNOW'); END CASE; END;
接著我們來看searched CASE的程式架構:
CASE
WHEN condition1 THEN statements
[ WHEN condition2 THEN statements ]
....
[ ELSE statements ]
END CASE;
searched CASE與simple CASE的差異在於searched使用condition替代expression,
使用condition就能變得較彈性,
但要控制好condition之間的互斥。
searched CASE範例程式碼:
DECLARE grade VARCHAR2(1) := 'A'; BEGIN CASE WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('EXCELLENT'); WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('VERY GOOD'); WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('GOOD'); ELSE DBMS_OUTPUT.PUT_LINE('UNKNOW'); END CASE; END;
FOR LOOP
當預先知道迴圈次數的情況下,可以使用for loop,
以下為FOR LOOP程式架構:
FOR loop_counter IN [ REVERSE ] lower_bound .. upper_bound
LOOP
statements
END LOOP;
這裡要注意的是進行動作的statement區塊要放置於LOOP與END LOOP中,
如果有REVERSE關鍵字出現,
迴圈就會從upper_bound開始遞減執行至lower_bound。
FOR LOOP範例程式碼:
BEGIN FOR i IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE(i); END LOOP; END;
輸出結果:1 2 3 4 5 6 7 8 9 10
LOOP(無窮迴圈)
Simple Loop是PL/SQL較特別的迴圈,從上面FOR LOOP來看,
我們可以發現FOR LOOP程式架構中包含了Simple Loop,
Simple Loop本身是個無窮迴圈,
需要加上停止條件才能夠跳出,
以下為Simple Loop的程式碼架構:
LOOP
statements
EXIT WHEN condition;
END LOOP;
當condition條件成立時會跳出LOOP。
LOOP範例程式碼:
DECLARE
i INTEGER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(i);
i := i + 1;
EXIT WHEN i = 10;
END LOOP;
END;
WHILE
while loop是根據條件式來判斷迴圈是否繼續進行,
與上述LOOP EXIT WHEN是相同的,
不同的是while是要先判斷條件是在進行迴圈,
且判斷式是相反的,
while判斷式成立就繼續迴圈,
且判斷式是相反的,
while判斷式成立就繼續迴圈,
而LOOP EXIT判斷的時機點可以自行選定,
以下為WHILE LOOP的程式碼架構:
WHILE condition
LOOP
statement
END LOOP;
WHILE範例程式碼:
DECLARE i INTEGER := 1; BEGIN WHILE i <= 10 LOOP DBMS_OUTPUT.PUT_LINE(i); i := i + 1; END LOOP; END;
輸出結果:1 2 3 4 5 6 7 8 9 10
參考來源:
Learning Oracle PL/SQL - OReilly 電子書
參考來源:
Learning Oracle PL/SQL - OReilly 電子書
寫的淺顯易懂!
回覆刪除希望之後能有更多plsql教學~
thx
感謝您的讚賞,限量會在將PLSQL教學文章排入文章撰寫的Queue中
回覆刪除