溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PL/SQL流程控制語(yǔ)句

發(fā)布時(shí)間:2020-10-21 11:11:03 來(lái)源:網(wǎng)絡(luò) 閱讀:465 作者:whshurk 欄目:關(guān)系型數(shù)據(jù)庫(kù)

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

l 控制語(yǔ)句: IF 語(yǔ)句
l 循環(huán)語(yǔ)句: LOOP語(yǔ)句, EXIT語(yǔ)句
l 順序語(yǔ)句: GOTO語(yǔ)句, NULL語(yǔ)句
1 條件語(yǔ)句
IF <布爾表達(dá)式> THEN
PL/SQL 和 SQL語(yǔ)句
END IF;

IF <布爾表達(dá)式> THEN
PL/SQL 和 SQL語(yǔ)句
ELSE
其它語(yǔ)句
END IF;

IF <布爾表達(dá)式> THEN
PL/SQL 和 SQL語(yǔ)句
ELSIF < 其它布爾表達(dá)式> THEN
其它語(yǔ)句
ELSIF < 其它布爾表達(dá)式> THEN
其它語(yǔ)句
ELSE
其它語(yǔ)句
END IF;
提示: ELSIF 不能寫(xiě)成 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:= '太少了,加點(diǎn)吧~!';
10 ELSIF v_salary <3000 THEN
11 V_comment:= '多了點(diǎn),少點(diǎn)吧~!';
12 ELSE
13 V_comment:= '沒(méi)有薪水~!';
14 END IF;
15 DBMS_OUTPUT.PUT_LINE(V_comment);
16 exception
17 when no_data_found then
18 DBMS_OUTPUT.PUT_LINE('沒(méi)有數(shù)據(jù)~!');
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;
沒(méi)有數(shù)據(jù)~!

PL/SQL procedure successfully completed.
2 CASE 表達(dá)式
---------格式一---------
CASE 條件表達(dá)式
WHEN 條件表達(dá)式結(jié)果1 THEN
語(yǔ)句段1
WHEN 條件表達(dá)式結(jié)果2 THEN
語(yǔ)句段2
......
WHEN 條件表達(dá)式結(jié)果n THEN
語(yǔ)句段n
[ELSE 條件表達(dá)式結(jié)果]
END;
---------格式二---------
CASE
WHEN 條件表達(dá)式1 THEN
語(yǔ)句段1
WHEN 條件表達(dá)式2 THEN
語(yǔ)句段2
......
WHEN 條件表達(dá)式n THEN
語(yǔ)句段n
[ELSE 語(yǔ)句段]
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 循環(huán)

  1. 1 簡(jiǎn)單循環(huán)

    LOOP
    要執(zhí)行的語(yǔ)句;
    EXIT WHEN <條件語(yǔ)句> --條件滿足,退出循環(huán)語(yǔ)句
    END LOOP;
    3.2 WHILE 循環(huán)
    WHILE <布爾表達(dá)式> LOOP
    要執(zhí)行的語(yǔ)句;
    END LOOP;
    3.3 數(shù)字式循環(huán)

[<<循環(huán)標(biāo)簽>>]
FOR 循環(huán)計(jì)數(shù)器 IN [ REVERSE ] 下限 .. 上限 LOOP
要執(zhí)行的語(yǔ)句;
END LOOP [循環(huán)標(biāo)簽];

每循環(huán)一次,循環(huán)變量自動(dòng)加1;使用關(guān)鍵字REVERSE,循環(huán)變量自動(dòng)減1。跟在IN REVERSE 后面的數(shù)字必須是從小到大的順序,而且必須是整數(shù),不能是變量或表達(dá)式。可以使用EXIT 退出循環(huán)。
實(shí)例參見(jiàn)Oracle LOOP循環(huán)控制語(yǔ)句
例1 在While循環(huán)中嵌套loop循環(huán)
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 || '個(gè)素?cái)?shù)是' || v_m);
21 END IF;
22
23 v_m := v_m + 2;
24 END LOOP;
25 END;
26 /
第1個(gè)素?cái)?shù)是101
第2個(gè)素?cái)?shù)是103
第3個(gè)素?cái)?shù)是107
第4個(gè)素?cái)?shù)是109

PL/SQL procedure successfully completed.
4 標(biāo)號(hào)和GOTO

PL/SQL中GOTO語(yǔ)句是無(wú)條件跳轉(zhuǎn)到指定的標(biāo)號(hào)去的意思。語(yǔ)法如下:

GOTO label;
......
<<label>> /標(biāo)號(hào)是用<< >>括起來(lái)的標(biāo)識(shí)符 /

注意,在以下地方使用是不合法的,編譯時(shí)會(huì)出錯(cuò)誤。
跳轉(zhuǎn)到非執(zhí)行語(yǔ)句前面。
跳轉(zhuǎn)到子塊中。
跳轉(zhuǎn)到循環(huán)語(yǔ)句中。
跳轉(zhuǎn)到條件語(yǔ)句中。
從異常處理部分跳轉(zhuǎn)到執(zhí)行。
從條件語(yǔ)句的一部分跳轉(zhuǎn)到另一部分。
例1:
SQL> DECLARE
2 V_counter NUMBER := 1;
3 BEGIN
4 LOOP
5 DBMS_OUTPUT.PUT_LINE('V_counter的當(dāng)前值為:'||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的當(dāng)前值為:'||V_counter);
13 END;
14 /
V_counter的當(dāng)前值為:1
V_counter的當(dāng)前值為:2
V_counter的當(dāng)前值為:3
V_counter的當(dāng)前值為:4
V_counter的當(dāng)前值為:5
V_counter的當(dāng)前值為:6
V_counter的當(dāng)前值為:7
V_counter的當(dāng)前值為:8
V_counter的當(dāng)前值為:9
V_counter的當(dāng)前值為:10
V_counter的當(dāng)前值為:11

PL/SQL procedure successfully completed.
5 NULL 語(yǔ)句

在PL/SQL 程序中,NULL語(yǔ)句是一個(gè)可執(zhí)行語(yǔ)句,可以用 null 語(yǔ)句來(lái)說(shuō)明“不用做任何事情”的意思,相當(dāng)于一個(gè)占位符或不執(zhí)行任何操作的空語(yǔ)句,可以使某些語(yǔ)句變得有意義,提高程序的可讀性,保證其他語(yǔ)句結(jié)構(gòu)的完整性和正確性。如:
例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 := &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;

PL/SQL procedure successfully completed.

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI