1. 程式人生 > >oracle PL/SQL的基本構成,結構控制語句,分支結構,選擇結構,loop迴圈結構,

oracle PL/SQL的基本構成,結構控制語句,分支結構,選擇結構,loop迴圈結構,

分支結構
分支結構是最基本的程式結構,分支結構由IF語句實現。
使用IF語句,根據條件可以改變程式的邏輯流程。IF語句有如下的形式:
IF 條件1 THEN
語句序列1;
[ELSIF 條件2 THEN
語句序列2;
ELSE
語句序列n;]
END IF;
其中:
  條件部分是一個邏輯表示式,值只能是真(TRUE)、假(FALSE)或空(NULL)。
語句序列為多條可執行的語句。
根據具體情況,分支結構可以有以下幾種形式:
IF-THEN-END IF
IF-THEN-ELSE-END IF
IF-THEN-ELSIF-ELSE-END IF
1.IF-THEN-END IF形式
這是最簡單的IF結構,練習如下:
【訓練1】  如果溫度大於30℃,則顯示“溫度偏高”。
輸入並執行以下程式:
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2.         DECLARE
  3.          V_temprature       NUMBER(5):=32;  
  4.          V_result           BOOLEAN:=false;  
  5.          BEGIN
  6.           V_result:= v_temprature >30;  
  7.          IF V_result THEN
  8.             DBMS_OUTPUT.PUT_LINE('溫度'|| V_temprature ||'度,偏高');  
  9.          END IF;   
  10.         END
    ;  

執行結果為:
Sql程式碼  收藏程式碼
  1. 溫度32度,偏高  
  2.         PL/SQL過程已成功完成。  

說明:該程式中使用了布林變數,初值為false,表示溫度低於30℃。表示式v_temprature >30返回值為布林型,賦給邏輯變數V_result。如果變數v_temprature的值大於30,則返回值為真,否則為假。V_result值為真就會執行IF到 END IF之間的輸出語句,否則沒有輸出結果。
試修改溫度的初值為25℃,重新執行,觀察結果。
2.IF-THEN-ELSE-END IF形式
這種形式的練習如下:
【訓練2】  根據性別,顯示尊稱。
輸入並執行以下程式:
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2.         DECLARE
  3.         v_sex   VARCHAR2(2);  
  4.         v_titil     VARCHAR2(10);  
  5. BEGIN
  6.   v_sex:='男';  
  7.   IF v_sex ='男'THEN
  8.     v_titil:='先生';  
  9.   ELSE
  10.     v_titil:='女士';  
  11.   END IF;   
  12.   DBMS_OUTPUT.PUT_LINE(v_titil||'您好!');  
  13. END;  

執行結果為:
Sql程式碼  收藏程式碼
  1. 先生您好!  
  2.         PL/SQL 過程已成功完成。  

說明:該程式根據性別顯示尊稱和問候,無論性別的值為何,總會有顯示結果輸出。如果V_sex的值不是‘男’和‘女’,那麼輸出結果會是什麼?
【練習1】對以上程式進行補充修改,在ELSE部分嵌入一個IF結構,如果V_sex的值不是'女',則顯示“朋友你好”。
3.IF-THEN-ELSIF-ELSE-END IF形式
這種形式的練習如下:
【訓練3】  根據僱員工資分級顯示稅金。
輸入並執行以下程式:
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2. DECLARE
  3.   v_sal  NUMBER(5);  
  4.   v_tax  NUMBER(5,2);  
  5. BEGIN
  6.   SELECT sal INTO v_sal  
  7.   FROM emp  
  8.   WHERE empno=7788;  
  9. IF v_sal >=3000 THEN
  10.             V_tax:= v_sal*0.08;--稅率8%
  11.          ELSIF v_sal>=1500 THEN
  12.              V_tax:= v_sal*0.06; --稅率6%
  13.         ELSE
  14.              V_tax:= v_sal*0.04; --稅率4%
  15.          END IF;  
  16.         DBMS_OUTPUT.PUT_LINE('應繳稅金:'||V_tax);  
  17.         END;  

執行結果為:
Sql程式碼  收藏程式碼
  1. 應繳稅金:240  
  2.         PL/SQL 過程已成功完成。  

說明:該程式根據工資計算7788號僱員應繳稅金,不同工資級別的稅率不同。
選擇結構
CASE語句適用於分情況的多分支處理,可有以下三種用法。
1.基本CASE結構
語句的語法如下:
CASE 選擇變數名
WHEN 表示式1 THEN
語句序列1
WHEN 表示式2 THEN
  語句序列2
WHEN 表示式n THEN
  語句序列n
ELSE
  語句序列n+1
END CASE;
在整個結構中,選擇變數的值同表示式的值進行順序匹配,如果相等,則執行相應的語句序列,如果不等,則執行ELSE部分的語句序列。
以下是一個使用CASE選擇結構的練習。
【訓練1】  使用CASE結構實現職務轉換。
輸入並執行程式:
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2. DECLARE
  3. v_job  VARCHAR2(10);  
  4. BEGIN
  5. SELECT job INTO v_job  
  6. FROM emp  
  7. WHERE empno=7788;  
  8. CASE v_job  
  9. WHEN'PRESIDENT'THEN
  10.  DBMS_OUTPUT.PUT_LINE('僱員職務:總裁');  
  11. WHEN'MANAGER'THEN
  12.  DBMS_OUTPUT.PUT_LINE('僱員職務:經理');  
  13. WHEN'SALESMAN'THEN
  14.  DBMS_OUTPUT.PUT_LINE('僱員職務:推銷員');  
  15. WHEN'ANALYST'THEN
  16.  DBMS_OUTPUT.PUT_LINE('僱員職務:系統分析員');  
  17. WHEN'CLERK'THEN
  18.  DBMS_OUTPUT.PUT_LINE('僱員職務:職員');  
  19. ELSE
  20.  DBMS_OUTPUT.PUT_LINE('僱員職務:未知');  
  21. ENDCASE;  
  22. END;  

執行結果:
Sql程式碼  收藏程式碼
  1. 僱員職務:系統分析員  
  2.         PL/SQL 過程已成功完成。   

說明:以上例項檢索僱員7788的職務,通過CASE結構轉換成中文輸出。
【練習1】將僱員號修改成其他已知僱員號,重新執行。
2.表示式結構CASE語句
在Oracle中,CASE結構還能以賦值表示式的形式出現,它根據選擇變數的值求得不同的結果。
它的基本結構如下:
變數=CASE 選擇變數名
WHEN 表示式1 THEN 值1
WHEN 表示式2 THEN 值2
WHEN 表示式n THEN 值n
ELSE值n+1
END;
【訓練2】  使用CASE的表示式結構。
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2.         DECLARE
  3.               v_grade   VARCHAR2(10);  
  4.              v_result   VARCHAR2(10);  
  5.         BEGIN
  6.              v_grade:='B';  
  7.              v_result:=CASE v_grade  
  8.               WHEN'A'THEN'優'
  9. WHEN'B'THEN'良'
  10.             WHEN'C'THEN'中'
  11.              WHEN'D'THEN'差'
  12.             ELSE'未知'
  13.         END;  
  14.         DBMS_OUTPUT.PUT_LINE('評價等級:'||V_result);  
  15.         END;  

執行結果為:
Sql程式碼  收藏程式碼
  1. 評價等級:良  
  2.         PL/SQL 過程已成功完成。  

說明:該CASE表示式通過判斷變數v_grade的值,對變數V_result賦予不同的值。
3.搜尋CASE結構
Oracle還提供了一種搜尋CASE結構,它沒有選擇變數,直接判斷條件表示式的值,根據條件表示式決定轉向。
CASE
WHEN 條件表示式1 THEN
  語句序列1
WHEN 條件表示式2 THEN
  語句序列2
WHEN 條件表示式n THEN
  語句序列n
ELSE
  語句序列n+1
END CASE;
【訓練3】  使用CASE的搜尋結構。
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2.         DECLARE
  3.            v_sal    NUMBER(5);  
  4.         BEGIN
  5.            SELECT sal INTO v_sal FROM emp   
  6.              WHERE empno=7788;  
  7.         CASE
  8.             WHEN v_sal>=3000 THEN
  9.         DBMS_OUTPUT.PUT_LINE('工資等級:高');  
  10.              WHEN v_sal>=1500 THEN
  11. DBMS_OUTPUT.PUT_LINE('工資等級:中');  
  12.        ELSE
  13.    DBMS_OUTPUT.PUT_LINE('工資等級:低');  
  14. ENDCASE;  
  15. END;  

執行結果為:
Sql程式碼  收藏程式碼
  1. 工資等級:高  
  2.         PL/SQL 過程已成功完成。   

說明:此結構類似於IF-THEN-ELSIF-ELSE-END IF結構。本訓練判斷7788僱員的工資等級。
迴圈結構
迴圈結構是最重要的程式控制結構,用來控制反覆執行一段程式。比如我們要進行累加,則可以通過適當的迴圈程式實現。PL/SQL迴圈結構可劃分為以下3種:
* 基本LOOP迴圈。
* FOR LOOP迴圈。
* WHILE LOOP迴圈。
1.基本LOOP迴圈
基本迴圈的結構如下:
LOOP --迴圈起始標識
語句1;
  語句2;
EXIT [WHEN 條件];
END LOOP; --迴圈結束標識
該迴圈的作用是反覆執行LOOP與END LOOP之間的語句。
EXIT用於在迴圈過程中退出迴圈,WHEN用於定義EXIT的退出條件。如果沒有WHEN條件,遇到EXIT語句則無條件退出迴圈。
【訓練1】 求:12+32+52+...+152 的值。
輸入並執行以下程式:
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2.         DECLARE
  3.          v_total        NUMBER(5):=0;  
  4.         v_count     NUMBER(5):=1;  
  5.         BEGIN
  6.         LOOP  
  7.             v_total:=v_total+v_count**2;  
  8.             EXIT WHEN v_count=15;--條件退出
  9. v_count:=v_count+2;  
  10.         END LOOP;  
  11.          DBMS_OUTPUT.PUT_LINE(v_total);  
  12.         END;  

輸出結果為:
Sql程式碼  收藏程式碼
  1. 680  
  2.         PL/SQL 過程已成功完成。  

說明:基本迴圈一定要使用EXIT退出,否則就會成為死迴圈。
【練習1】求1*2*3*4*...*10的值。
2.FOR LOOP迴圈
FOR迴圈是固定次數迴圈,格式如下:
FOR 控制變數 in [REVERSE] 下限..上限
LOOP
語句1;
  語句2;
   END LOOP;
迴圈控制變數是隱含定義的,不需要宣告。
下限和上限用於指明迴圈次數。正常情況下迴圈控制變數的取值由下限到上限遞增,REVERSE關鍵字表示迴圈控制變數的取值由上限到下限遞減。
以下是FOR迴圈結構的練習。
【訓練2】  用FOR迴圈輸出圖形。
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2.         BEGIN
  3.         FOR I IN 1..8   
  4.         LOOP  
  5.         DBMS_OUTPUT.PUT_LINE(to_char(i)||rpad('*',I,'*'));  
  6.         END LOOP;  
  7.         END;  

輸出結果為:
Sql程式碼  收藏程式碼
  1. 1*  
  2. 2**  
  3. 3***  
  4. 4****  
  5. 5*****  
  6. 6******  
  7. 7*******  
  8. 8********  
  9.         PL/SQL 過程已成功完成。   

說明:該程式在迴圈中使用了迴圈控制變數I,該變數隱含定義。在每次迴圈中根據迴圈控制變數I的值,使用RPAD函式控制顯示相應個數的“*”。
【練習2】為以上程式增加REVERSE關鍵字,觀察執行結果。
【訓練3】  輸出一個空心三角形。
Sql程式碼  收藏程式碼
  1. BEGIN
  2.         FOR I IN 1..9  
  3.         LOOP   
  4.          IF I=1 OR I=9 THEN
  5.          DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ',12-I,' ')||rpad('*',2*i-1,'*'));   
  6. ELSE
  7.       DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ',12-I,' ')||'*'||rpad(' ',I*2-3,' ')||'*');   
  8.         END IF;  
  9.         END LOOP;   
  10.         END;  

輸出結果為:
Sql程式碼  收藏程式碼
  1. 1           *  
  2. 2          * *  
  3. 3         *   *  
  4. 4        *     *  
  5. 5       *       *  
  6. 6      *         *  
  7. 7     *           *  
  8. 8    *             *  
  9. 9   *****************  
  10. PL/SQL 過程已成功完成。  

  說明:該例項採用迴圈和IF結構相結合,對第1行和第9行(I=1 OR I=9)執行同樣的輸出語句,其他行執行另外的輸出語句。
【練習3】修改程式,輸出一個實心三角形。
3.WHILE LOOP迴圈
WHILE迴圈是有條件迴圈,其格式如下:
WHILE 條件
LOOP
語句1;
語句2;
END LOOP;
當條件滿足時,執行迴圈體;當條件不滿足時,則結束迴圈。如果第一次判斷條件為假,則不執行迴圈體。
以下是WHILE迴圈結構的練習。
【訓練3】 使用WHILE 迴圈向emp表連續插入5個記錄。
步驟1:執行下面的程式:
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2. DECLARE
  3. v_count NUMBER(2) := 1;  
  4. BEGIN
  5.   WHILE v_count <6 LOOP  
  6.     INSERTINTO emp(empno, ename)  
  7.     VALUES (5000+v_count, '臨時');  
  8. v_count := v_count + 1;  
  9.   END LOOP;  
  10.   COMMIT;  
  11. END;  

輸出結果為:
Sql程式碼  收藏程式碼
  1. PL/SQL 過程已成功完成。  

步驟2:顯示插入的記錄:
Sql程式碼  收藏程式碼
  1. SELECT empno,ename FROM emp WHERE ename='臨時';  

輸出結果為:
    Sql程式碼  收藏程式碼
  1. EMPNO ENAME  
  2.         ------------------ ----------
  3.       5001 臨時  
  4.       5002 臨時  
  5.       5003 臨時  
  6.       5004 臨時  
  7.       5005 臨時  
  8.         已選擇5行。  

步驟3:刪除插入的記錄:
Sql程式碼  收藏程式碼
  1. DELETEFROM emp WHERE ename='臨時';  
  2.         COMMIT;  

輸出結果為:
Sql程式碼  收藏程式碼
  1. 已刪除5行。  
  2.         提交完成。  

說明:該練習使用WHILE迴圈向emp表插入5個新記錄(僱員編號根據迴圈變數生成),並通過查詢語句顯示新插入的記錄,然後刪除。
4.多重迴圈
迴圈可以巢狀,以下是一個二重迴圈的練習。
【訓練4】 使用二重迴圈求1!+2!+...+10!的值。
步驟1:第1種演算法:
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2. DECLARE
  3.   v_total   NUMBER(8):=0;  
  4.   v_ni  NUMBER(8):=0;  
  5.   J     NUMBER(5);  
  6. BEGIN
  7. FOR I IN 1..10  
  8.   LOOP  
  9.     J:=1;  
  10.       v_ni:=1;  
  11.     WHILE J<=I  
  12.     LOOP  
  13.       v_ni:= v_ni*J;  
  14.       J:=J+1;  
  15.     END LOOP;--內迴圈求n!
  16. v_total:=v_total+v_ni;  
  17.   END LOOP;--外迴圈求總和
  18.   DBMS_OUTPUT.PUT_LINE(v_total);  
  19. END;  

輸出結果為:
Sql程式碼  收藏程式碼
  1. 4037913  
  2. PL/SQL 過程已成功完成。  

步驟2:第2種演算法:
Sql程式碼  收藏程式碼
  1. SET SERVEROUTPUT ON
  2. DECLARE
  3.   v_total       NUMBER(8):=0;  
  4.   v_ni      NUMBER(8):=1;  
  5. BEGIN
  6.   FOR I IN 1..10  
  7.   LOOP  
  8.     v_ni:= v_ni*I;  --求n!
  9.     v_total:= v_total+v_ni;  
  10.   END LOOP;     --迴圈求總和
  11.   DBMS_OUTPUT.PUT_LINE(v_total);  
  12. END;  

輸出結果為:
Sql程式碼  收藏程式碼
  1. 409114  
  2.         PL/SQL 過程已成功完成。   

說明:第1種演算法的程式內迴圈使用WHILE迴圈求階層,外迴圈使用FOR迴圈求總和。第2種演算法是簡化的演算法,根據是:n!=n*(n?1)!。

黑色頭髮:http://heisetoufa.iteye.com/