PostgreSQL 教程: PL/pgSQL exit 退出语句

八月 22, 2023

摘要:在本教程中,您将了解 exit 语句以及如何使用它来终止循环或代码块。

PL/pgSQL exit 语句简介

exit语句允许您终止循环,包括无条件循环while 循环for 循环

下面显示了exit语句的语法:

exit [label] [when boolean_expression]

labelexit所在的当前循环或外循环的循环标签。依据标签,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的值为123

j大于3时,第二条exit语句终止内部循环。这就是您看到对于外循环的每次迭代j输出为123的原因。

以下示例将外循环的标签放置在第二个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语句退出块。