选择记录并将其作为函数参数传递
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;
它可能看起来像是现有问题的重复(例如 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;