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 表达的逻辑,所以我想知道应该如何编写存储过程?
根据您必须支持的版本,在 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 函数通常更好。它们通常很快,有时甚至是计划透明的。