oracle PL/SQL的基本構成,結構控制語句,分支結構,選擇結構,loop迴圈結構,
阿新 • • 發佈:2019-01-01
分支結構
分支結構是最基本的程式結構,分支結構由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程式碼
執行結果為:
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程式碼
執行結果為:
Sql程式碼
說明:該程式根據性別顯示尊稱和問候,無論性別的值為何,總會有顯示結果輸出。如果V_sex的值不是‘男’和‘女’,那麼輸出結果會是什麼?
【練習1】對以上程式進行補充修改,在ELSE部分嵌入一個IF結構,如果V_sex的值不是'女',則顯示“朋友你好”。
3.IF-THEN-ELSIF-ELSE-END IF形式
這種形式的練習如下:
【訓練3】 根據僱員工資分級顯示稅金。
輸入並執行以下程式:
Sql程式碼
執行結果為:
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程式碼
執行結果:
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程式碼
執行結果為:
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程式碼
執行結果為:
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程式碼
輸出結果為:
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程式碼
輸出結果為:
Sql程式碼
說明:該程式在迴圈中使用了迴圈控制變數I,該變數隱含定義。在每次迴圈中根據迴圈控制變數I的值,使用RPAD函式控制顯示相應個數的“*”。
【練習2】為以上程式增加REVERSE關鍵字,觀察執行結果。
【訓練3】 輸出一個空心三角形。
Sql程式碼
輸出結果為:
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程式碼
輸出結果為:
Sql程式碼
步驟2:顯示插入的記錄:
Sql程式碼
輸出結果為:
Sql程式碼
步驟3:刪除插入的記錄:
Sql程式碼
輸出結果為:
Sql程式碼
說明:該練習使用WHILE迴圈向emp表插入5個新記錄(僱員編號根據迴圈變數生成),並通過查詢語句顯示新插入的記錄,然後刪除。
4.多重迴圈
迴圈可以巢狀,以下是一個二重迴圈的練習。
【訓練4】 使用二重迴圈求1!+2!+...+10!的值。
步驟1:第1種演算法:
Sql程式碼
輸出結果為:
Sql程式碼
步驟2:第2種演算法:
Sql程式碼
輸出結果為:
Sql程式碼
說明:第1種演算法的程式內迴圈使用WHILE迴圈求階層,外迴圈使用FOR迴圈求總和。第2種演算法是簡化的演算法,根據是:n!=n*(n?1)!。
黑色頭髮:http://heisetoufa.iteye.com/
分支結構是最基本的程式結構,分支結構由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程式碼
- SET SERVEROUTPUT ON
- DECLARE
- V_temprature NUMBER(5):=32;
- V_result BOOLEAN:=false;
- BEGIN
- V_result:= v_temprature >30;
- IF V_result THEN
- DBMS_OUTPUT.PUT_LINE('溫度'|| V_temprature ||'度,偏高');
- END IF;
- END
執行結果為:
Sql程式碼
- 溫度32度,偏高
- 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程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_sex VARCHAR2(2);
- v_titil VARCHAR2(10);
- BEGIN
- v_sex:='男';
- IF v_sex ='男'THEN
- v_titil:='先生';
- ELSE
- v_titil:='女士';
- END IF;
- DBMS_OUTPUT.PUT_LINE(v_titil||'您好!');
- END;
執行結果為:
Sql程式碼
- 先生您好!
- PL/SQL 過程已成功完成。
說明:該程式根據性別顯示尊稱和問候,無論性別的值為何,總會有顯示結果輸出。如果V_sex的值不是‘男’和‘女’,那麼輸出結果會是什麼?
【練習1】對以上程式進行補充修改,在ELSE部分嵌入一個IF結構,如果V_sex的值不是'女',則顯示“朋友你好”。
3.IF-THEN-ELSIF-ELSE-END IF形式
這種形式的練習如下:
【訓練3】 根據僱員工資分級顯示稅金。
輸入並執行以下程式:
Sql程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_sal NUMBER(5);
- v_tax NUMBER(5,2);
- BEGIN
- SELECT sal INTO v_sal
- FROM emp
- WHERE empno=7788;
- IF v_sal >=3000 THEN
- V_tax:= v_sal*0.08;--稅率8%
- ELSIF v_sal>=1500 THEN
- V_tax:= v_sal*0.06; --稅率6%
- ELSE
- V_tax:= v_sal*0.04; --稅率4%
- END IF;
- DBMS_OUTPUT.PUT_LINE('應繳稅金:'||V_tax);
- END;
執行結果為:
Sql程式碼
- 應繳稅金:240
- 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程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_job VARCHAR2(10);
- BEGIN
- SELECT job INTO v_job
- FROM emp
- WHERE empno=7788;
- CASE v_job
- WHEN'PRESIDENT'THEN
- DBMS_OUTPUT.PUT_LINE('僱員職務:總裁');
- WHEN'MANAGER'THEN
- DBMS_OUTPUT.PUT_LINE('僱員職務:經理');
- WHEN'SALESMAN'THEN
- DBMS_OUTPUT.PUT_LINE('僱員職務:推銷員');
- WHEN'ANALYST'THEN
- DBMS_OUTPUT.PUT_LINE('僱員職務:系統分析員');
- WHEN'CLERK'THEN
- DBMS_OUTPUT.PUT_LINE('僱員職務:職員');
- ELSE
- DBMS_OUTPUT.PUT_LINE('僱員職務:未知');
- ENDCASE;
- END;
執行結果:
Sql程式碼
- 僱員職務:系統分析員
- 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程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_grade VARCHAR2(10);
- v_result VARCHAR2(10);
- BEGIN
- v_grade:='B';
- v_result:=CASE v_grade
- WHEN'A'THEN'優'
- WHEN'B'THEN'良'
- WHEN'C'THEN'中'
- WHEN'D'THEN'差'
- ELSE'未知'
- END;
- DBMS_OUTPUT.PUT_LINE('評價等級:'||V_result);
- END;
執行結果為:
Sql程式碼
- 評價等級:良
- 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程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_sal NUMBER(5);
- BEGIN
- SELECT sal INTO v_sal FROM emp
- WHERE empno=7788;
- CASE
- WHEN v_sal>=3000 THEN
- DBMS_OUTPUT.PUT_LINE('工資等級:高');
- WHEN v_sal>=1500 THEN
- DBMS_OUTPUT.PUT_LINE('工資等級:中');
- ELSE
- DBMS_OUTPUT.PUT_LINE('工資等級:低');
- ENDCASE;
- END;
執行結果為:
Sql程式碼
- 工資等級:高
- 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程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_total NUMBER(5):=0;
- v_count NUMBER(5):=1;
- BEGIN
- LOOP
- v_total:=v_total+v_count**2;
- EXIT WHEN v_count=15;--條件退出
- v_count:=v_count+2;
- END LOOP;
- DBMS_OUTPUT.PUT_LINE(v_total);
- END;
輸出結果為:
Sql程式碼
- 680
- 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程式碼
- SET SERVEROUTPUT ON
- BEGIN
- FOR I IN 1..8
- LOOP
- DBMS_OUTPUT.PUT_LINE(to_char(i)||rpad('*',I,'*'));
- END LOOP;
- END;
輸出結果為:
Sql程式碼
- 1*
- 2**
- 3***
- 4****
- 5*****
- 6******
- 7*******
- 8********
- PL/SQL 過程已成功完成。
說明:該程式在迴圈中使用了迴圈控制變數I,該變數隱含定義。在每次迴圈中根據迴圈控制變數I的值,使用RPAD函式控制顯示相應個數的“*”。
【練習2】為以上程式增加REVERSE關鍵字,觀察執行結果。
【訓練3】 輸出一個空心三角形。
Sql程式碼
- BEGIN
- FOR I IN 1..9
- LOOP
- IF I=1 OR I=9 THEN
- DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ',12-I,' ')||rpad('*',2*i-1,'*'));
- ELSE
- DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ',12-I,' ')||'*'||rpad(' ',I*2-3,' ')||'*');
- END IF;
- END LOOP;
- END;
輸出結果為:
Sql程式碼
- 1 *
- 2 * *
- 3 * *
- 4 * *
- 5 * *
- 6 * *
- 7 * *
- 8 * *
- 9 *****************
- 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程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_count NUMBER(2) := 1;
- BEGIN
- WHILE v_count <6 LOOP
- INSERTINTO emp(empno, ename)
- VALUES (5000+v_count, '臨時');
- v_count := v_count + 1;
- END LOOP;
- COMMIT;
- END;
輸出結果為:
Sql程式碼
- PL/SQL 過程已成功完成。
步驟2:顯示插入的記錄:
Sql程式碼
- SELECT empno,ename FROM emp WHERE ename='臨時';
輸出結果為:
Sql程式碼
- EMPNO ENAME
- ------------------ ----------
- 5001 臨時
- 5002 臨時
- 5003 臨時
- 5004 臨時
- 5005 臨時
- 已選擇5行。
步驟3:刪除插入的記錄:
Sql程式碼
- DELETEFROM emp WHERE ename='臨時';
- COMMIT;
輸出結果為:
Sql程式碼
- 已刪除5行。
- 提交完成。
說明:該練習使用WHILE迴圈向emp表插入5個新記錄(僱員編號根據迴圈變數生成),並通過查詢語句顯示新插入的記錄,然後刪除。
4.多重迴圈
迴圈可以巢狀,以下是一個二重迴圈的練習。
【訓練4】 使用二重迴圈求1!+2!+...+10!的值。
步驟1:第1種演算法:
Sql程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_total NUMBER(8):=0;
- v_ni NUMBER(8):=0;
- J NUMBER(5);
- BEGIN
- FOR I IN 1..10
- LOOP
- J:=1;
- v_ni:=1;
- WHILE J<=I
- LOOP
- v_ni:= v_ni*J;
- J:=J+1;
- END LOOP;--內迴圈求n!
- v_total:=v_total+v_ni;
- END LOOP;--外迴圈求總和
- DBMS_OUTPUT.PUT_LINE(v_total);
- END;
輸出結果為:
Sql程式碼
- 4037913
- PL/SQL 過程已成功完成。
步驟2:第2種演算法:
Sql程式碼
- SET SERVEROUTPUT ON
- DECLARE
- v_total NUMBER(8):=0;
- v_ni NUMBER(8):=1;
- BEGIN
- FOR I IN 1..10
- LOOP
- v_ni:= v_ni*I; --求n!
- v_total:= v_total+v_ni;
- END LOOP; --迴圈求總和
- DBMS_OUTPUT.PUT_LINE(v_total);
- END;
輸出結果為:
Sql程式碼
- 409114
- PL/SQL 過程已成功完成。
說明:第1種演算法的程式內迴圈使用WHILE迴圈求階層,外迴圈使用FOR迴圈求總和。第2種演算法是簡化的演算法,根據是:n!=n*(n?1)!。
黑色頭髮:http://heisetoufa.iteye.com/