共计 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 网 – 提供最优质的资源集合!