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

时间:2015-10-02 18:06:17

标签: postgresql types plpgsql declare select-into

我发现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 $$;

1 个答案:

答案 0 :(得分:21)

  

只获得2-3列而不是所有列

一种方法:使用record变量:

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

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

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

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

至于你的第一个例子:%ROWTYPE只是Postgres中的噪音。 The documentation

  

(因为每个表都有一个相同名称的关联复合类型,   在PostgreSQL中你是否写%ROWTYPE无关紧要   或不。但是%ROWTYPE的表单更具可移植性。)

所以:

DO $$
DECLARE
   my_data t;  -- table name serves as type name, too. 
BEGIN
   SELECT INTO my_data  * FROM t WHERE id = ?;
END $$;