函数从表返回单行

时间:2019-01-08 19:10:35

标签: postgresql plpgsql

我一生无法获得此功能以正确返回一行(当我在主键上查询时,它只会返回一行)。看起来像这样。

CREATE OR REPLACE FUNCTION sch.getrow(
    IN gy integer,
    IN gw integer,
    IN pi uuid)
RETURNS SETOF record AS $$

BEGIN

EXECUTE 'SELECT * FROM sch.foo WHERE gy = $1 AND gw = $2 AND idpi = $3' INTO record USING gy, gw, pi;

END

$$
LANGUAGE plpgsql IMMUTABLE;

尝试各种RETURN EXECUTERETURN QUERY等,但要注意的是:由于表名最终会根据输入变量而变化,因此SQL字符串将是动态定义的字符串。

1 个答案:

答案 0 :(得分:1)

如果函数返回SETOF,则无论函数可以返回多少行(一个或多个),都可以使用RETURN QUERY

CREATE OR REPLACE FUNCTION sch.getrow(
    IN gy integer,
    IN gw integer,
    IN pi uuid)
RETURNS SETOF record AS $$
BEGIN
    RETURN QUERY
    EXECUTE 'SELECT * FROM sch.foo WHERE gy = $1 AND gw = $2 AND idpi = $3' USING gy, gw, pi;

END

$$
LANGUAGE plpgsql;

无关但重要。该函数不应定义为IMMUTABLE,因为其结果取决于表中存储的数据。每个the documentation:

  

IMMUTABLE表示该函数无法修改数据库,并且在给定相同的参数值时始终返回相同的结果;也就是说,它不会执行数据库查找或以其他方式使用其参数列表中未直接显示的信息。