我有一个set-returns函数(SRF),它接受一个整数参数并从表中返回一组行。我使用SELECT * FROM tst.mySRF(3);
调用它,然后像返回的表一样操纵返回的值。
我想要做的是在数组的每个元素上执行它;但是,当我使用SELECT * FROM tst.mySRF(unnest(array[3,4]));
调用它时,会返回一个错误“在上下文中调用的set-valued函数,它不能接受一个集合”。如果我改为使用SELECT tst.mySRF(unnest(array[3,4]));
来调用它,我会得到一组类型tst.tbl
。
表格定义:
DROP TABLE tst.tbl CASCADE;
CREATE TABLE tst.tbl (
id serial NOT NULL,
txt text NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO tst.tbl(txt) VALUES ('a'), ('b'), ('c'), ('d');
功能定义:
CREATE OR REPLACE FUNCTION tst.mySRF(
IN p_id integer
)
RETURNS setof tst.tbl
LANGUAGE plpgsql
AS $body$
DECLARE
BEGIN
RETURN QUERY
SELECT id, txt
FROM tst.tbl
WHERE id = p_id;
END;
$body$;
呼叫:
SELECT * FROM tst.mySRF(3)
按预期返回一个表格。SELECT tst.mySRF(unnest(array[3,4]))
按预期返回一个包含tst.tbl
类型列的表格。SELECT * FROM tst.mySRF(unnest(array[3,4]))
返回上述错误,我原本预计会有一张桌子。答案 0 :(得分:3)
要避免出现“单列表”问题,您需要使用(row).*
表示法显式扩展SRF结果
SELECT (tst.mySRF(unnest(array[3,4]))).*;
如果我理解@depesz,LATERAL
将提供更有效或直接的方法来实现相同的结果。