在 PL/pgSQL 中声明行类型变量

问题描述 投票:0回答:1

据我发现,

SELECT * FROM t INTO my_data;
仅在以下情况下才有效:

DO $$
DECLARE
my_data t%ROWTYPE;
BEGIN
SELECT * FROM t INTO my_data WHERE id = ?;
END $$;

我说得对吗?

如果我只想获取 2-3 列而不是所有列。我该如何定义

my_data

也就是说,

DO $$
DECLARE
my_data <WHAT HERE??>;
BEGIN
SELECT id,name,surname FROM t INTO my_data WHERE id = ?;
END $$;
postgresql types plpgsql declare select-into
1个回答
42
投票

仅获取 2-3 列而不是所有列

一种方法:使用

record
变量:

DO
$do$
DECLARE
   _rec record;
BEGIN
   SELECT INTO _rec
          id, name, surname
   FROM   t
   WHERE  id = ?;

   -- do something with it ...
END
$do$;

请注意,

record
类型的结构在分配之前是未定义的。因此,在此之前您无法引用列(字段)。

另一种方法:分配多个标量变量:

DO
$do$
DECLARE
   _id int;
   _name text;
   _surname text;
BEGIN
   SELECT INTO _id, _name, _surname
          id,  name,  surname
   FROM   t
   WHERE  id = ?;
END
$do$;

%ROWTYPE
在 Postgres 中只是噪音。 手册

(由于每个表都有一个关联的同名复合类型, 实际上在 PostgreSQL 中你是否写

%ROWTYPE
并不重要 或不。但带有
%ROWTYPE
的形式更便携。)

所以:

DO
$do$
DECLARE
   my_data t;  -- table name serves as type name, too. 
BEGIN
   SELECT INTO my_data * FROM t WHERE id = ?;
END
$do$;
© www.soinside.com 2019 - 2024. All rights reserved.