从函数返回查询?

时间:2011-09-25 20:13:42

标签: sql function postgresql 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;

类型record仅允许单行。

如何返回整个查询?我想将函数用作查询模板。

1 个答案:

答案 0 :(得分: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;

这样打电话:

SELECT * FROM get_names('name')

重点:

  • 使用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;