八月 22, 2023
摘要:在本教程中,您将了解 exit 语句以及如何使用它来终止循环或代码块。
目录
PL/pgSQL exit 语句简介
exit语句允许您终止循环,包括无条件循环、while 循环和 for 循环。
下面显示了exit语句的语法:
exit [label] [when boolean_expression]
label是exit所在的当前循环或外循环的循环标签。依据标签,exit语句将终止相应的循环。如果不使用标签,exit语句将终止它所在的当前循环。
when boolean_expression子句用于指定终止循环的条件。如果boolean_expression计算结果为true,则该exit语句将终止循环。
以下语句是等效的:
exit when counter > 10;
if counter > 10 then
exit;
end if;
exit when绝对更干净、更简短。
除了终止循环之外,还可以使用exit语句来终止由begin...end关键字指定的块。在这种情况下,控制权被传递到当前块的end关键字后面的语句:
<<block_label>>
BEGIN
-- some code
EXIT [block_label] [WHEN condition];
-- some more code
END block_label;
PL/pgSQL exit 语句示例
让我们看一些使用 PL/pgSQL 的exit语句的示例。
1) 使用 PL/pgSQL exit 语句终止无条件循环
以下示例说明如何在无条件循环中使用exit语句:
do
$$
declare
i int = 0;
j int = 0;
begin
<<outer_loop>>
loop
i = i + 1;
exit when i > 3;
-- inner loop
j = 0;
<<inner_loop>>
loop
j = j + 1;
exit when j > 3;
raise notice '(i,j): (%,%)', i, j;
end loop inner_loop;
end loop outer_loop;
end;
$$
输出:
NOTICE: (i,j): (1,1)
NOTICE: (i,j): (1,2)
NOTICE: (i,j): (1,3)
NOTICE: (i,j): (2,1)
NOTICE: (i,j): (2,2)
NOTICE: (i,j): (2,3)
NOTICE: (i,j): (3,1)
NOTICE: (i,j): (3,2)
NOTICE: (i,j): (3,3)
怎么运行的。
此示例包含两个循环:外循环和内循环。
由于这两个exit语句都不使用任何循环标签,因此它们将终止当前循环。
当i大于3时,第一个exit语句终止外循环。这就是为什么您在输出中看到i的值为1、2和3。
当j大于3时,第二条exit语句终止内部循环。这就是您看到对于外循环的每次迭代j输出为1、2和3的原因。
以下示例将外循环的标签放置在第二个exit语句中:
do
$$
declare
i int = 0;
j int = 0;
begin
<<outer_loop>>
loop
i = i + 1;
exit when i > 3;
-- inner loop
j = 0;
<<inner_loop>>
loop
j = j + 1;
exit outer_loop when j > 3;
raise notice '(i,j): (%,%)', i, j;
end loop inner_loop;
end loop outer_loop;
end;
$$
输出:
NOTICE: (i,j): (1,1)
NOTICE: (i,j): (1,2)
NOTICE: (i,j): (1,3)
在此示例中,第二条exit语句在j大于 3 时终止外循环。
2) 使用 PL/pgSQL exit 语句退出块
以下示例说明了如何使用exit语句来终止代码块:
do
$$
begin
<<simple_block>>
begin
exit simple_block;
-- for demo purposes
raise notice '%', 'unreachable!';
end;
raise notice '%', 'End of block';
end;
$$
输出
NOTICE: End of block
在此示例中,exit 语句立即终止了simple_block:
exit simple_block;
这条语句永远不会执行:
raise notice '%', 'unreachable!';
总结
- 使用
exit语句终止循环,包括无条件循环、while循环和for循环。 - 还可以使用
exit语句退出块。