在存储过程中返回记录集

JRR*_*JRR 4 postgresql stored-procedures plpgsql set-returning-functions

我想从 pl/pgsql 返回一组记录。有没有办法在不使用“for”构造和游标的情况下做到这一点?例如,当我比较这两个存储过程时:

create or replace function sqlProc () returns setof integer as $$                                                                                                                                              
  select * from foo;
$$ language sql;


create or replace function plpgSqlProc () returns setof integer as $$
declare
  c integer;
begin
  for c in select * from foo loop
    return next c;
end loop;

end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

纯 SQL 版本的时间性能是 pl/pgsql 版本的 2 倍!不幸的是,我还有其他无法用纯 SQL 表达的逻辑,所以我想知道应该如何编写存储过程?

Chr*_*ers 5

根据您必须支持的版本,在 PostgreSQL 中有几种方法可以做到这一点。最简单的是:

create or replace function plpgSqlProc () returns setof integer as $$
BEGIN

RETURN QUERY select * from foo;
END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)

话虽如此,我发现在不需要帮助程序代码的地方,普通的 SQL 函数通常更好。它们通常很快,有时甚至是计划透明的。