共計 3479 個字符,預計需要花費 9 分鐘才能閱讀完成。
介紹 PL/SQL 的流程控制語句, 包括如下三類:
l 控制語句: IF 語句
l 循環語句: LOOP 語句, EXIT 語句
l 順序語句: GOTO 語句, NULL 語句
1 條件語句
IF 布爾表達式 THEN
PL/SQL 和 SQL 語句
END IF;
IF 布爾表達式 THEN
PL/SQL 和 SQL 語句
ELSE
其它語句
END IF;
IF 布爾表達式 THEN
PL/SQL 和 SQL 語句
ELSIF 其它布爾表達式 THEN
其它語句
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 :=
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 :=
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
語句段 1
WHEN 條件表達式 2 THEN
語句段 2
……
WHEN 條件表達式 n THEN
語句段 n
[ELSE 語句段]
END;
例 1:
SQL DECLARE
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
PL/SQL procedure successfully completed.
3 循環
1 簡單循環
LOOP
要執行的語句;
EXIT WHEN 條件語句 – 條件滿足,退出循環語句
END LOOP;
3.2 WHILE 循環
WHILE 布爾表達式 LOOP
要執行的語句;
END LOOP;
3.3 數字式循環
[循環標簽]
FOR 循環計數器 IN [REVERSE] 下限 .. 上限 LOOP
要執行的語句;
END LOOP [循環標簽];
每循環一次,循環變量自動加 1;使用關鍵字 REVERSE,循環變量自動減 1。跟在 IN REVERSE 后面的數字必須是從小到大的順序,而且必須是整數,不能是變量或表達式。可以使用 EXIT 退出循環。
實例參見 Oracle LOOP 循環控制語句
例 1 在 While 循環中嵌套 loop 循環
SQL DECLARE
2 v_m NUMBER := 101;
3 v_i NUMBER;
4 v_n NUMBER := 0;
5 BEGIN
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
PL/SQL procedure successfully completed.
4 標號和 GOTO
PL/SQL 中 GOTO 語句是無條件跳轉到指定的標號去的意思。語法如下:
GOTO label;
……
label / 標號是用 括起來的標識符 /
注意,在以下地方使用是不合法的,編譯時會出錯誤。
跳轉到非執行語句前面。
跳轉到子塊中。
跳轉到循環語句中。
跳轉到條件語句中。
從異常處理部分跳轉到執行。
從條件語句的一部分跳轉到另一部分。
例 1:
SQL DECLARE
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);
13 END;
14 /
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
PL/SQL procedure successfully completed.
5 NULL 語句
在 PL/SQL 程序中,NULL 語句是一個可執行語句,可以用 null 語句來說明“不用做任何事情”的意思,相當于一個占位符或不執行任何操作的空語句,可以使某些語句變得有意義,提高程序的可讀性,保證其他語句結構的完整性和正確性。如:
例 1:
SQL DECLARE
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 :=
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 :=
new 7: v_emp_id := 206;
PL/SQL procedure successfully completed.
向 AI 問一下細節
丸趣 TV 網 – 提供最優質的資源集合!