PL/pgSQL 块结构

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

摘要:在本教程中,您将了解 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 执行块,请单击“执行”按钮,如下图所示:

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

匿名块必须用单引号括起来,如下所示:

'<<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;

在 body 部分中,我们使用 select into 带有 count() 函数的语句从 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 块结构

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

概括

  • PL/pgSQL 是一种块结构语言。它将程序组织成块。
  • 一个块包含两部分:声明和主体。声明部分是可选的,而正文部分是强制性的。
  • 块可以嵌套。嵌套块是放置在另一个块的主体内的块。