PL/pgSQL 变量

在本教程中,您将学习各种声明 PL/pgSQL 变量的技术。

摘要:在本教程中,您将学习各种声明 PL/pgSQL 变量的技术。

PL/pgSQL 中的变量介绍

变量是一个有意义的内存位置名称。变量保存一个可以通过块更改的值。变量总是与特定的数据类型相关联。

在使用变量之前,您必须在PL/pgSQL 块的声明部分声明它。

下面说明了声明变量的语法。

variable_name data_type [:= expression];

在这个语法中:

  • 首先,指定变量的名称。为变量分配一个有意义的名称是一种很好的做法。例如, i 您应该使用 index or代替命名变量 counter 。
  • 其次,将特定数据类型与变量相关联。数据类型可以是任何有效的数据类型,例如integer、numeric、varchar和 char。
  • 第三,可选地为变量分配默认值。如果不这样做,变量的初始值是 NULL 。

请注意,您可以使用 := 或 = 赋值运算符来初始化变量并将值分配给变量。

以下示例说明了如何声明和初始化变量:

do $$ declare
   counter    integer := 1;
   first_name varchar(50) := 'John';
   last_name  varchar(50) := 'Doe';
   payment    numeric(11,2) := 20.5;
begin 
   raise notice '% % % has been paid % USD', 
       counter, 
       first_name, 
       last_name, 
       payment;
end $$;

该 counter 变量是被初始化为1的整数

该 first_name 和 last_name 是 varchar(50) 和初始化 'John' 和 'Doe' 字符串常量。

的类型 payment 为数值型,其值初始化为 20.5

变量初始化时序

PostgreSQL 评估变量的默认值,并在进入块时将其分配给变量。例如:

do $$ declare
   created_at time := now();
begin 
   raise notice '%', created_at;
   perform pg_sleep(10);
   raise notice '%', created_at;
end $$;

这是输出:

NOTICE:  14:23:33.064008
NOTICE:  14:23:33.064008

在这个例子中:

  • 首先,声明一个变量,其默认值初始化为当前时间。
  • 其次,打印出变量的值并使用 pg_sleep() 函数在 10 秒内传递执行。
  • 第三, created_at 再次打印出变量的值。

从输出中可以清楚地看出, 的值 created_at 仅在进入块时初始化一次。

复制数据类型

在 %type 提供了一个表列或另一变量的数据类型。通常,您使用 %type 来声明一个变量,该变量包含来自数据库或另一个变量的值。

下面说明如何使用表列的数据类型声明变量:

variable_name table_name.column_name%type;

下面显示了如何使用另一个变量的数据类型声明一个变量:

variable_name variable%type;

请参阅示例数据库中的以下电影表:

此示例使用类型复制技术来声明保存来自 film 表的值的变量:

do $$ declare
   film_title film.title%type;
   featured_title film_title%type;
begin 
   -- get title of the film id 100
   select title
   from film
   into film_title
   where film_id = 100;

   -- show the film title
   raise notice 'Film title id 100: %s', film_title;
end; $$

这个例子声明了两个变量:

  • 该 film_title 变量与 PostgreSQL Sakila 示例数据库表中的 title 列具有相同的数据类型。 film
  • 的 featured_title 具有相同的数据类型作为数据类型 film_title 的变量。

通过使用类型复制功能,您可以获得以下优势:

  • 首先,您不需要知道所引用的列或引用的类型。
  • 其次,如果引用的列名(或变量)的数据类型发生变化,则不需要更改函数的定义。

块和子块中的变量

当您在子块中声明一个与外部块中的另一个变量同名的变量时,外部块中的变量隐藏在子块中。

如果要访问外部块中的变量,请使用块标签来限定其名称,如下例所示:

do $$ <<outer_block>>
declare
  counter integer := 0;
begin
   counter := counter + 1;
   raise notice 'The current value of the counter is %', counter;

   declare
       counter integer := 0;
   begin
       counter := counter + 10;
       raise notice 'Counter in the subblock is %', counter;
       raise notice 'Counter in the outer block is %', outer_block.counter;
   end;

   raise notice 'Counter in the outer block is %', counter;

end outer_block $$;
NOTICE:  The current value of the counter is 1
NOTICE:  Counter in the subblock is 10
NOTICE:  Counter in the outer block is 1
NOTICE:  Counter in the outer block is 1

在这个例子中:

  • 首先,声明一个 counter 在 outer_block .
  • 接下来,在子块中声明一个同名的变量。
  • 然后,在进入子块之前,计数器的值为1。在子块中,我们将 的值 counter 增加到 10 并打印出来。请注意,更改仅影响 counter 子块中的变量。
  • 之后, counter 使用块标签引用外部块中的变量以限定其名称 outer_block.counter 。
  • 最后,打印出 counter 外部块中变量的值,其值保持不变。

在本教程中,您学习了声明 PL/pgSQL 变量的各种方法。