PostgreSQL 教程: PL/pgSQL 代码块结构

八月 20, 2023

摘要:在本教程中,您将了解 PL/pgSQL 的块结构以及如何编写和执行第一个 PL/pgSQL 块。

PL/pgSQL 是一种块结构语言,因此,PL/pgSQL 函数存储过程被组织成代码块。

下面说明了 PL/pgSQL 中完整块的语法:

[ <<label>> ]
[ declare
    declarations ]
begin
    statements;
	...
end [ label ];

让我们更详细地查看块结构:

  • 每个块都有两个部分:声明和主体。声明部分是可选的,而主体部分是必需的。块以END关键字后面的分号 (;)结束。
  • 块可以在开头和结尾有一个可选标签。当您想要在块体的EXIT语句中指定它,或当您想要限定块中声明的变量的名称时,可以使用块标签。
  • 声明部分是声明主体部分中使用的所有变量的地方。声明部分中的每条语句均以分号 (;) 结尾。
  • 主体部分是放置代码的地方。主体部分中的每个语句也以分号 (;) 结尾。

PL/pgSQL 块结构示例

以下示例说明了一个非常简单的块。它被称为匿名块。

do $$ 
<<first_block>>
declare
  film_count integer := 0;
begin
   -- get the number of films
   select count(*) 
   into film_count
   from film;
   -- display a message
   raise notice 'The number of films is %', film_count;
end first_block $$;
NOTICE:  The current value of counter is 1

要从 pgAdmin 执行块,请单击“执行”按钮,如下图所示:

img

请注意,DO语句不属于该块。它用于执行匿名块。PostgreSQL 从 9.0 版本开始引入了DO语句。

匿名块可以用单引号引起来,如下所示:

'<<first_block>>
declare
  film_count integer := 0;
begin
   -- get the number of films
   select count(*) 
   into film_count
   from film;
   -- display a message
   raise notice ''The number of films is %'', film_count;
end first_block';

但是,我们使用美元符号引用的字符串常量语法来使其更具可读性。

在声明部分,我们声明了一个变量film_count并将其值设置为零。

film_count integer := 0;

在主体部分中,我们使用了带有count()函数的select into语句来从film表中获取电影数量,并将结果分配给film_count变量。

select count(*) 
into film_count
from film;

之后,我们使用raise notice语句显示一条消息:

raise notice 'The number of films is %', film_count;

%是一个占位符,将被film_count变量值的内容替换。

请注意,该first_block标签仅用于演示目的。在此示例中它不执行任何操作。

PL/pgSQL 子块

PL/pgSQL 允许您将一个块放置在另一个块的主体内。

嵌套在另一个块内的块称为子块。包含子块的块被称为外部块。

下图说明了外部块和子块:

plpgsql block structure

通常,您会将一个大块划分为更小且更具逻辑性的子块。子块中的变量可以具有与外部块中的变量相同的名称,尽管这不是一个好的做法。

概括

  • PL/pgSQL 是一种块结构语言。它将程序组织成块。

  • 一个块包含两部分:声明和主体。声明部分是可选的,而主体部分是必需的。

  • 块可以嵌套。嵌套块是放置在另一个块体内的块。