天天看點

PL/SQL流程控制語句

介紹PL/SQL的流程控制語句, 包括如下三類:

IF <布爾表達式> THEN

PL/SQL 和 SQL語句

ELSIF < 其它布爾表達式> THEN

其它語句

ELSE

END IF;

提示: ELSIF 不能寫成 ELSEIF

例1:

SQL> conn hr/hr@pdbtest

Connected.

SQL> set serveroutput on

SQL> DECLARE

2 v_empno employees.employee_id%TYPE :=&empno;

3 V_salary employees.salary%TYPE;

4 V_comment VARCHAR2(35);

5 BEGIN

6 SELECT salary INTO v_salary FROM employees

7 WHERE employee_id = v_empno;

8 IF v_salary < 1500 THEN

9 V_comment:= '太少了,加點吧~!';

10 ELSIF v_salary <3000 THEN

11 V_comment:= '多了點,少點吧~!';

12 ELSE

13 V_comment:= '沒有薪水~!';

14 END IF;

15 DBMS_OUTPUT.PUT_LINE(V_comment);

16 exception

17 when no_data_found then

18 DBMS_OUTPUT.PUT_LINE('沒有資料~!');

19 when others then

20 DBMS_OUTPUT.PUT_LINE(sqlcode || '---' || sqlerrm);

21 END;

22 /

Enter value for empno: 2278

old 2: v_empno employees.employee_id%TYPE :=&empno;

new 2: v_empno employees.employee_id%TYPE :=2278;

沒有資料~!

PL/SQL procedure successfully completed.

2 CASE 表達式

---------格式一---------

CASE 條件表達式

WHEN 條件表達式結果1 THEN 

語句段1

WHEN 條件表達式結果2 THEN

語句段2

......

WHEN 條件表達式結果n THEN

語句段n

[ELSE 條件表達式結果]

END;

---------格式二---------

CASE 

WHEN 條件表達式1 THEN

WHEN 條件表達式2 THEN

WHEN 條件表達式n THEN 

[ELSE 語句段]

2 V_grade char(1) := UPPER('&p_grade');

3 V_appraisal VARCHAR2(20);

4 BEGIN

5 V_appraisal :=

6 CASE v_grade

7 WHEN 'A' THEN 'Excellent'

8 WHEN 'B' THEN 'Very Good'

9 WHEN 'C' THEN 'Good'

10 ELSE 'No such grade'

11 END;

12 DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||' Appraisal: '|| v_appraisal);

13 END;

14 /

Enter value for p_grade: D

old 2: V_grade char(1) := UPPER('&p_grade');

new 2: V_grade char(1) := UPPER('D');

Grade:D Appraisal: No such grade

3 循環

1 簡單循環

LOOP

要執行的語句;

EXIT WHEN <條件語句> --條件滿足,退出循環語句

END LOOP;

3.2 WHILE 循環

WHILE <布爾表達式> LOOP

3.3 數字式循環

[<<循環标簽>>]

FOR 循環計數器 IN [ REVERSE ] 下限 .. 上限 LOOP

END LOOP [循環标簽];

每循環一次,循環變量自動加1;使用關鍵字REVERSE,循環變量自動減1。跟在IN REVERSE 後面的數字必須是從小到大的順序,而且必須是整數,不能是變量或表達式。可以使用EXIT 退出循環。

執行個體參見Oracle LOOP循環控制語句

例1 在While循環中嵌套loop循環

2 v_m NUMBER := 101;

3 v_i NUMBER;

4 v_n NUMBER := 0;

6 WHILE v_m < 110 LOOP

7 v_i := 2;

8 LOOP

9 IF mod(v_m, v_i) = 0 THEN

10 v_i := 0;

11 EXIT;

12 END IF;

13

14 v_i := v_i + 1;

15 EXIT WHEN v_i > v_m - 1;

16 END LOOP;

17

18 IF v_i > 0 THEN

19 v_n := v_n + 1;

20 DBMS_OUTPUT.PUT_LINE('第'|| v_n || '個素數是' || v_m);

21 END IF;

22

23 v_m := v_m + 2;

24 END LOOP;

25 END;

26 /

第1個素數是101

第2個素數是103

第3個素數是107

第4個素數是109

4 标号和GOTO

PL/SQL中GOTO語句是無條件跳轉到指定的标号去的意思。文法如下:

GOTO label;

<<label>> /标号是用<< >>括起來的辨別符 /

注意,在以下地方使用是不合法的,編譯時會出錯誤。

跳轉到非執行語句前面。

跳轉到子塊中。

跳轉到循環語句中。

跳轉到條件語句中。

從異常處理部分跳轉到執行。

從條件語句的一部分跳轉到另一部分。

2 V_counter NUMBER := 1;

3 BEGIN

4 LOOP

5 DBMS_OUTPUT.PUT_LINE('V_counter的目前值為:'||V_counter);

6 V_counter := v_counter + 1;

7 IF v_counter > 10 THEN

8 GOTO labelOffLOOP;

9 END IF;

10 END LOOP;

11 <<labelOffLOOP>>

12 DBMS_OUTPUT.PUT_LINE('V_counter的目前值為:'||V_counter);

V_counter的目前值為:1

V_counter的目前值為:2

V_counter的目前值為:3

V_counter的目前值為:4

V_counter的目前值為:5

V_counter的目前值為:6

V_counter的目前值為:7

V_counter的目前值為:8

V_counter的目前值為:9

V_counter的目前值為:10

V_counter的目前值為:11

5 NULL 語句

在PL/SQL 程式中,NULL語句是一個可執行語句,可以用 null 語句來說明“不用做任何事情”的意思,相當于一個占位符或不執行任何操作的空語句,可以使某些語句變得有意義,提高程式的可讀性,保證其他語句結構的完整性和正确性。如:

2 v_emp_id employees.employee_id%TYPE;

3 v_first_name employees.first_name%TYPE;

4 v_salary employees.salary%TYPE;

5 v_sal_raise NUMBER(3,2);

6 BEGIN

7 v_emp_id := &emp_id;

8 SELECT first_name, salary INTO v_first_name, v_salary

9 FROM employees WHERE employee_id = v_emp_id;

10 IF v_salary <= 3000 THEN

11 v_sal_raise := .10;

12 DBMS_OUTPUT.PUT_LINE(v_first_name||'的工資是'||v_salary

13 ||'、工資漲幅是'||v_sal_raise);

14 ELSE

15 NULL;

16 END IF;

17 END;

18 /

Enter value for emp_id: 206

old 7: v_emp_id := &emp_id;

new 7: v_emp_id := 206;

     本文轉自whshurk 51CTO部落格,原文連結:http://blog.51cto.com/shurk/2052403,如需轉載請自行聯系原作者