从函数返回查询?

Squ*_*all 2 sql postgresql function plpgsql

我正在使用PostgreSQL 8.4,我想创建一个返回多行查询的函数.
下面的函数不能正常工作:

create function get_names(varchar) returns setof record AS $$
declare
    tname alias for $1;
    res setof record;
begin
    select * into res from mytable where name = tname;
    return res;
end;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

该类型record仅允许单行.

如何返回整个查询?我想使用函数作为查询模板.

Erw*_*ter 5

CREATE OR REPLACE FUNCTION get_names(_tname varchar)
  RETURNS TABLE (col_a integer, col_b text) AS
$func$
BEGIN
   RETURN QUERY
   SELECT t.col_a, t.col_b  -- must match RETURNS TABLE
   FROM   mytable t
   WHERE  t.name = _tname;    
END
$func$  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

像这样打电话:

SELECT * FROM get_names('name')
Run Code Online (Sandbox Code Playgroud)

主要观点:

  • 使用RETURNS TABLE,因此您不必为每次调用提供列名列表.

  • 使用RETURN QUERY,更简单.

  • 表限定列名以避免命名与具有相同名称的OUT参数(包括声明的列RETURNS TABLE)的冲突.

  • 使用命名变量而不是ALIAS.更简单,做同样的事情,这是首选方式.

  • 像这样的简单函数也可以写成LANGUAGE sql:

CREATE OR REPLACE FUNCTION get_names(_tname varchar)
  RETURNS TABLE (col_a integer, col_b text) AS
$func$
SELECT t.col_a, t.col_b  --, more columns - must match RETURNS above
FROM   mytable t
WHERE  t.name = $1;
$func$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)