域名 AXUM.RS 将于 2025 年 10 月到期。我们无意再对其进行续费,如果你有意接续这个域名,请与我们取得联系。
  • AXUM.RS 现仅需人民币 3000 元(大写:叁仟元整。接受适度议价
  • 按照行业规则,AXUM.RS 到期后,大概率会进入长时间的赎回期,该期间内,如果你想拥有该域名,将要付出高额的费用
  • 我们已启用 AXUM.EU.ORG 域名,并将持续运营
  • 仅接受微信或支付宝交易
如果你对 AXUM.RS 有兴趣,请和我们进行联系:

变量

本章将学习 PL/pgSQL 变量的相关知识。

简介

变量是指向内存位置的有意义的名称,它保存的值可以通过块进行修改。变量就是与特定的数据类型关联。

变量名 数据类型 [:= 表达式];
  • 变量名:指定变量的名称。一个有意义的变量名是非常有必要的。
  • 数据类型:将特定的数据类型与变量相关联
  • [:= 表达式]:可选的。可以给变量设置初始值。如果省略这部分,变量的初始值是 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_namelast_name:都是数据类型为 VARCHAR(50) 变量,它们的初始值分别是 JohnDoe
  • payment:是一个初始值为 20.5 ,数据类型为 numeric(11,2) 的变量

变量初始化时序

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
*/

复制数据类型

%type 可以获取字段或其它变量的数据类型。通常应该使用 %type 来声明指向数据库某字段或另一个变量值的变量。语法如下:

-- 声明具有指定字段数据类型的变量
变量名 表名.字段名%type;

-- 声明具有另一个变量数据类型的变量
变量名 其它变量%type;

以示例数据库的 film 为例:

此示例声明了两个变量:

  • film_title变量:与 film 表中的 title 字段具有相同的数据类型
  • 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
*/

通过 SELECT INTO 语句,可以将查询结果赋值给变量,语法如下:

select select_list
into variable_name
from table_expression;

示例:

要查看完整内容,请先登录