PL/pgSQL 变量
在本教程中,您将学习各种声明 PL/pgSQL 变量的技术。
摘要:在本教程中,您将学习各种声明 PL/pgSQL 变量的技术。
PL/pgSQL 中的变量介绍
变量是一个有意义的内存位置名称。变量保存一个可以通过块更改的值。变量总是与特定的数据类型相关联。
在使用变量之前,您必须在PL/pgSQL 块的声明部分声明它。
下面说明了声明变量的语法。
variable_name data_type [:= expression];
在这个语法中:
- 首先,指定变量的名称。为变量分配一个有意义的名称是一种很好的做法。例如,
i您应该使用indexor代替命名变量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 变量的各种方法。