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