【发布时间】:2014-06-05 18:15:05
【问题描述】:
问题是我需要运行一个查询(仅在运行时知道)来确定我的函数的输入参数,它需要返回一个结果。比如我想写:
CREATE FUNCTION foo(inputKey INT) RETURNS TABLE (c0 INT, c1 TEXT) AS $$
BEGIN
-- Do something with inputKey to compute and return result
END;
$$ LANGUAGE PLPGSQL;
这些是我尝试过的查询:
-- Doesn't even run (exception)
SELECT * FROM foo(SELECT foreignKey FROM someTable WHERE primaryKey = 5);
-- Runs, but returns a single column with all columns listed in it's value
SELECT foo(foreignKey) FROM someTable WHERE primaryKey = 5;
-- Same problem as previous
SELECT * FROM (SELECT foo(foreignKey) FROM someTable WHERE primaryKey = 5) AS a
我也尝试将结果类型更改为
myType (CREATE TYPE myType AS (c0 INT, c1 TEXT))SETOF myTypeRECORDSETOF RECORD
以上所有都表现出相同的行为。
调用返回记录、表或记录集的 plpgsql 函数获取多列结果的语法是什么?这个问题听起来很简单,但经过无数次互联网搜索,我一直无法弄清楚这个问题的语法。我在网上找到的所有问题都使用SELECT * FROM function() 语法,绝对没有有人从另一个查询传递输入参数的例子。
【问题讨论】:
-
SELECT foo(foreignKey).* FROM someTable WHERE primaryKey = 5;怎么样?这可能会将记录取消嵌套到列中 (SQLFiddle example) -
@TomasGreif :语法是 SELECT (foo(foreignKey)).* FROM someTable WHERE primaryKey = 5;不幸的是,这将导致为返回表中的每一列调用该函数。
标签: sql function postgresql plpgsql postgresql-9.3