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

25

我发现只有在以下情况下SELECT * FROM t INTO my_data;才有效:


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

Great! How may I assist you today?
DO $$
DECLARE
my_data <WHAT HERE??>;
BEGIN
SELECT id,name,surname FROM t INTO my_data WHERE id = ?;
END $$;
1个回答

40

获取仅包含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 $$;

对于您的第一个例子:在Postgres中,%ROWTYPE只是噪音。根据文档

(由于每个表都有与其同名的关联复合类型,因此在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 $$;

最后一部分返回错误:关系my_data不存在。 - Raj Shah
2
@RajShah:如果表不在当前的“search_path”中,您必须对两个实例进行模式限定:my_schema.my_data - 这在任何情况下都是安全的路线。请参见:https://dev59.com/h2ox5IYBdhLWcg3wpV3F#9067777 和 https://dev59.com/22Ij5IYBdhLWcg3wJB9-#24089729 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接