欢迎来到 Oracle PL/SQL 编程入门 的第六章!在这一章中,我们将深入探讨 PL/SQL 中的循环控制结构——LOOP
语句。通过学习 LOOP
、WHILE
、FOR
等不同类型的循环语句,你将能够编写更加灵活和高效的程序逻辑。此外,我们还会介绍如何使用 EXIT
、CONTINUE
和嵌套循环等高级功能。准备好迎接新的挑战了吗?让我们开始吧!
第一节:循环控制:Loop 语句
循环控制结构是编程中的重要组成部分,它们允许重复执行一段代码直到满足特定条件。PL/SQL 提供了多种循环控制结构,其中最常用的就是 LOOP
语句。
1.1 简单的 Loops 语句
简单的 LOOP
语句是最基本的循环结构,它会不断执行循环体内的代码,直到遇到 EXIT
或 EXIT WHEN
语句。
示例:
DECLARE
v_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('当前计数: ' || v_counter);
v_counter := v_counter + 1;
-- 当计数达到5时退出循环
EXIT WHEN v_counter > 5;
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 1
当前计数: 2
当前计数: 3
当前计数: 4
当前计数: 5
循环结束
小贴士:LOOP 语句就像跑步机
LOOP
语句就像是一个跑步机,只要你不按下停止按钮(EXIT
),它就会一直运行下去。合理使用EXIT
和EXIT WHEN
可以让你的循环更加可控。
第二节:EXIT 语句、EXIT WHEN 语句
EXIT
语句用于立即退出当前循环,而 EXIT WHEN
则是在满足某个条件时退出循环。
2.1 使用 EXIT 语句
EXIT
语句可以无条件地退出当前循环。
示例:
DECLARE
v_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('当前计数: ' || v_counter);
v_counter := v_counter + 1;
-- 无条件退出循环
IF v_counter > 5 THEN
EXIT;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 1
当前计数: 2
当前计数: 3
当前计数: 4
当前计数: 5
循环结束
2.2 使用 EXIT WHEN 语句
EXIT WHEN
语句可以在满足某个条件时退出循环,使代码更加简洁。
示例:
DECLARE
v_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('当前计数: ' || v_counter);
v_counter := v_counter + 1;
-- 当计数达到5时退出循环
EXIT WHEN v_counter > 5;
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 1
当前计数: 2
当前计数: 3
当前计数: 4
当前计数: 5
循环结束
小贴士:EXIT WHEN 让退出更优雅
EXIT WHEN
语句就像是一个智能的“停止”按钮,当条件满足时自动退出循环。相比手动检查条件再使用EXIT
,它让代码更加简洁和易读。
第三节:WHILE Loops 语句
WHILE
循环会在每次循环开始前检查条件是否为真,如果条件为真,则执行循环体内的代码;否则退出循环。
示例:
DECLARE
v_counter NUMBER := 1;
BEGIN
WHILE v_counter <= 5 LOOP
DBMS_OUTPUT.PUT_LINE('当前计数: ' || v_counter);
v_counter := v_counter + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 1
当前计数: 2
当前计数: 3
当前计数: 4
当前计数: 5
循环结束
小贴士:WHILE 循环适合前置条件
WHILE
循环非常适合那些需要在每次循环开始前检查条件的情况。它就像是一个守门员,只有符合条件才能进入循环体内。
第四节:Numeric FOR Loops
FOR
循环是一种非常常见的循环结构,它可以简化重复执行某段代码的过程。FOR
循环有两种形式:普通 FOR
循环和带有 REVERSE
选项的 FOR
循环。
4.1 使用 IN 选项
普通的 FOR
循环使用 IN
选项来指定循环的范围。
示例:
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('当前计数: ' || i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 1
当前计数: 2
当前计数: 3
当前计数: 4
当前计数: 5
循环结束
4.2 使用 REVERSE 选项
带有 REVERSE
选项的 FOR
循环会从大到小遍历循环变量。
示例:
BEGIN
FOR i IN REVERSE 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('当前计数: ' || i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 5
当前计数: 4
当前计数: 3
当前计数: 2
当前计数: 1
循环结束
4.3 中断循环
在 FOR
循环中也可以使用 EXIT
或 EXIT WHEN
来中断循环。
示例:
BEGIN
FOR i IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('当前计数: ' || i);
-- 当计数达到5时退出循环
EXIT WHEN i = 5;
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 1
当前计数: 2
当前计数: 3
当前计数: 4
当前计数: 5
循环结束
小贴士:FOR 循环让重复更简单
FOR
循环就像是一个自动化的生产线,你可以轻松设定它的起点和终点,甚至可以选择反向运行。合理使用FOR
循环可以大大简化你的代码。
第五节:CONTINUE 语句
CONTINUE
语句用于跳过当前循环的剩余部分,并继续下一次循环。它有两种形式:CONTINUE
和 CONTINUE WHEN
。
5.1 使用 CONTINUE
CONTINUE
语句无条件跳过当前循环的剩余部分。
示例:
BEGIN
FOR i IN 1..5 LOOP
IF i = 3 THEN
CONTINUE;
END IF;
DBMS_OUTPUT.PUT_LINE('当前计数: ' || i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 1
当前计数: 2
当前计数: 4
当前计数: 5
循环结束
5.2 使用 CONTINUE WHEN
CONTINUE WHEN
语句在满足某个条件时跳过当前循环的剩余部分。
示例:
BEGIN
FOR i IN 1..5 LOOP
CONTINUE WHEN i = 3;
DBMS_OUTPUT.PUT_LINE('当前计数: ' || i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
当前计数: 1
当前计数: 2
当前计数: 4
当前计数: 5
循环结束
小贴士:CONTINUE 让跳过更智能
CONTINUE
语句就像是一个聪明的跳板,当你不想执行某些代码时,它可以帮助你直接跳到下一次循环。合理使用CONTINUE
可以让你的代码更加高效。
第六节:嵌套 Loops
有时候你需要在一个循环内部再嵌套另一个循环,这种结构称为嵌套循环。嵌套循环可以帮助你处理更复杂的逻辑。
6.1 使用嵌套 Loops
下面是一个简单的嵌套循环示例,展示如何打印乘法表。
示例:
BEGIN
FOR i IN 1..5 LOOP
FOR j IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(i || ' * ' || j || ' = ' || (i * j));
END LOOP;
DBMS_OUTPUT.PUT_LINE('---');
END LOOP;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
---
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
---
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
---
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
---
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
---
循环结束
6.2 使用 Loop Labels
为了更好地管理嵌套循环,你可以使用标签来标识每个循环。
示例:
<<outer_loop>>
BEGIN
FOR i IN 1..3 LOOP
<<inner_loop>>
FOR j IN 1..3 LOOP
IF i = 2 AND j = 2 THEN
EXIT outer_loop; -- 退出外层循环
END IF;
DBMS_OUTPUT.PUT_LINE('i=' || i || ', j=' || j);
END LOOP inner_loop;
END LOOP outer_loop;
DBMS_OUTPUT.PUT_LINE('循环结束');
END;
/
输出结果:
i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
循环结束
小贴士:嵌套循环要谨慎使用
嵌套循环就像是俄罗斯套娃,虽然功能强大,但过度嵌套会让代码变得难以阅读和维护。尽量保持代码简洁明了,避免过多的嵌套层次。
第七节:注意事项
在编写 PL/SQL 代码时,有一些常见问题需要注意,以避免潜在的错误和性能问题。
7.1 避免死循环
确保循环中有适当的退出条件,避免陷入死循环。死循环就像是一个永远不会停下的跑步机,会让你的程序无法正常运行。
7.2 合理使用 CONTINUE 和 EXIT
合理使用 CONTINUE
和 EXIT
语句可以让循环更加高效,但也要注意不要滥用,以免影响代码的可读性。
7.3 处理嵌套循环
在处理嵌套循环时,使用标签可以更好地管理各个循环,避免混淆和错误。
第八节:代码挑战
现在是时候来挑战一下自己了!我们将通过几个简单的练习来巩固所学的知识。
挑战一:计算阶乘
编写一个 PL/SQL 块,计算并输出给定数字的阶乘。
示例代码:
DECLARE
v_number NUMBER := &number; -- 输入数字
v_factorial NUMBER := 1;
BEGIN
FOR i IN 1..v_number LOOP
v_factorial := v_factorial * i;
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_number || '! = ' || v_factorial);
END;
/
执行说明:
- 在 SQL*Plus 或 SQL Developer 中运行上述代码块。
- 提示输入数字,例如
5
。 - 输出结果应为
5! = 120
。
挑战二:打印九九乘法表
编写一个 PL/SQL 块,打印九九乘法表。
示例代码:
BEGIN
FOR i IN 1..9 LOOP
FOR j IN 1..9 LOOP
DBMS_OUTPUT.PUT(i || ' * ' || j || ' = ' || (i * j) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
END LOOP;
END;
/
执行说明:
- 在 SQL*Plus 或 SQL Developer 中运行上述代码块。
- 输出结果应为完整的九九乘法表。
小贴士:动手实践是最好的老师
理论知识固然重要,但真正的技能提升来自于不断的实践。通过这些挑战,你可以加深对 PL/SQL 的理解,并发现自己可能忽略的小细节。勇敢地面对每一个挑战,你会发现编程其实并没有那么难!
第九节:本章总结
在这一章中,我们深入探讨了 PL/SQL 中的循环控制结构——LOOP
语句以及 EXIT
、CONTINUE
和嵌套循环等高级功能。以下是本章的主要内容总结:
总结要点:
- 简单的 Loops 语句:掌握
LOOP
语句的基本用法,包括EXIT
和EXIT WHEN
。 - WHILE Loops 语句:了解
WHILE
循环的用法,适用于需要在每次循环开始前检查条件的情况。 - Numeric FOR Loops:熟悉
FOR
循环的两种形式:普通FOR
循环和带有REVERSE
选项的FOR
循环。 - CONTINUE 语句:了解如何使用
CONTINUE
和CONTINUE WHEN
来跳过当前循环的剩余部分。 - 嵌套 Loops:掌握如何嵌套循环,并使用标签来管理嵌套循环。
- 注意事项:避免死循环,合理使用
CONTINUE
和EXIT
,处理嵌套循环时使用标签。
恭喜你完成了第六章的学习!通过这节课,你已经掌握了 PL/SQL 中的循环控制结构,并为后续更高级的内容打下了坚实的基础。未来的学习中,我们将继续探索 PL/SQL 的更多功能,如异常处理、存储过程等。希望你能继续保持对 PL/SQL 的兴趣,勇敢探索,成为一名熟练的 PL/SQL 用户!