从 table 返回单行的函数
Function returning single row from a table
我这辈子都无法让这个函数正确地 return 一行(它只会 return 一行,因为我正在查询主键)。看起来像这样。
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 = AND gw = AND idpi = ' INTO record USING gy, gw, pi;
END
$$
LANGUAGE plpgsql IMMUTABLE;
尝试各种 RETURN EXECUTE
和 RETURN QUERY
等,但是 nada:SQL 字符串将是一个动态定义的字符串,因为 table 名称最终会根据输入变量。
如果函数 returns SETOF
你可以使用 RETURN QUERY
不管有多少行(一行或多行)函数可以 return.
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 = AND gw = AND idpi = ' USING gy, gw, pi;
END
$$
LANGUAGE plpgsql;
不相关但很重要。该函数不应定义为 IMMUTABLE
,因为其结果取决于存储在 table 中的数据。每 the documentation:
IMMUTABLE indicates that the function cannot modify the database and always returns the same result when given the same argument values; that is, it does not do database lookups or otherwise use information not directly present in its argument list.
我这辈子都无法让这个函数正确地 return 一行(它只会 return 一行,因为我正在查询主键)。看起来像这样。
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 = AND gw = AND idpi = ' INTO record USING gy, gw, pi;
END
$$
LANGUAGE plpgsql IMMUTABLE;
尝试各种 RETURN EXECUTE
和 RETURN QUERY
等,但是 nada:SQL 字符串将是一个动态定义的字符串,因为 table 名称最终会根据输入变量。
如果函数 returns SETOF
你可以使用 RETURN QUERY
不管有多少行(一行或多行)函数可以 return.
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 = AND gw = AND idpi = ' USING gy, gw, pi;
END
$$
LANGUAGE plpgsql;
不相关但很重要。该函数不应定义为 IMMUTABLE
,因为其结果取决于存储在 table 中的数据。每 the documentation:
IMMUTABLE indicates that the function cannot modify the database and always returns the same result when given the same argument values; that is, it does not do database lookups or otherwise use information not directly present in its argument list.