选择记录并将其作为函数参数传递

Selecting and passing a record as a function argument

它可能看起来像是现有问题的重复(例如 This one),但它们只处理传递 "new" 参数,而不是从数据库中选择行。

我有一个table,例如:

CREATE TABLE my_table (
    id bigserial NOT NULL,
    name text,
    CONSTRAINT my_table_pkey PRIMARY KEY (id)
);

还有一个函数:

CREATE FUNCTION do_something(row_in my_table) RETURNS void AS
$$
BEGIN
    -- does something
END;
$$
LANGUAGE plpgsql;

我想 运行 它基于数据库中已有的数据。如果我想从另一个 PL/pgSQL 存储过程中使用它也没问题,例如:

-- ...
SELECT * INTO row_var FROM my_table WHERE id = 123; -- row_var is of type my_table%rowtype
PERFORM do_something(row_var);
-- ...

但是,我不知道如何使用 "ordinary" 查询来做到这一点,例如

SELECT do_something(SELECT * FROM my_table WHERE id = 123);

ERROR:  syntax error at or near "SELECT"
LINE 1: SELECT FROM do_something(SELECT * FROM my_table ...

有没有办法执行这样的查询?

您需要将标量记录传递给该函数,这需要将实际的 select 括在另一对括号中:

SELECT do_something( (SELECT * FROM my_table WHERE id = 123) );

但是上面的 NOT 工作,因为该函数只需要 单个 列(my_table 类型的记录) 而 select * return 多列(这与具有多个字段的单个记录不同)。

为了 return 来自 select 的记录,您需要使用以下语法:

SELECT do_something( (SELECT my_table FROM my_table WHERE id = 123) );

请注意,如果您不确保 select return 正好是一行,这仍然可能会失败。

如果你想将函数应用于多行,你可以这样做:

select do_something(my_table)
from my_table;