如何从PostgreSQL 9中的函数返回表,行或记录?

Mit*_*ode 4 postgresql function

我有一个名为person的表,该表具有id,name,status,由于具有1个parameter(name)的函数,我想返回行。有人可以帮助我吗?请让它变得简单,因为在postgresSQL中我非常菜鸟。

这是我正常功能的代码

create or replace function fn_list(vname varchar) returns void as $$
begin
    SELECT id,name,status from usuario WHERE name= vname;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

我知道即时通讯正在返回void函数,但是如果我想要一个行列表怎么办?

小智 12

使用循环返回查询结果速度慢且效率低。为此甚至不需要 PL/pgSQL 的开销。

最好的解决方案是:

create or replace function fn_list(vname varchar) 
  returns table(id integer, name text, status text) 
as $$
  SELECT id,name,status 
  from usuario 
  WHERE name= vname;
$$ language sql;
Run Code Online (Sandbox Code Playgroud)

如果因为需要在查询之前运行一些其他过程代码而需要 PL/pgSQL,return query则应使用 then 而不是循环:

create or replace function fn_list(vname varchar) 
  returns table(id integer, name text, status text) 
as $$
begin
  -- do some work....
  return query
    SELECT id,name,status 
    from usuario 
    WHERE name= vname;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

然后使用以下方式调用它:

select *
from fn_list('Arthur');
Run Code Online (Sandbox Code Playgroud)


Hor*_*rus 5

我知道Oracle中的管道返回会做到这一点,所以我用它来从plpgsql中查找“ RETURN NEXT”:

http://www.postgresql.org/message-id/007b01c6dc31$ae395920$0a00a8c0@trivadis.com

同样在grokbase上:

http://grokbase.com/t/postgresql/pgsql-performance/069kcttrfr/pipelined-functions-in-postgres

(编辑以添加官方文档):http : //www.postgresql.org/docs/9.2/static/plpgsql-control-structures.html

杀手,我自己必须利用这个。

再编辑一次以添加一些演示代码(直接来自postgresql.org文档):

CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT);
INSERT INTO foo VALUES (1, 2, 'three');
INSERT INTO foo VALUES (4, 5, 'six');

CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF foo AS
$BODY$
DECLARE
    r foo%rowtype;
BEGIN
    FOR r IN SELECT * FROM foo
    WHERE fooid > 0
    LOOP
        -- can do some processing here
        RETURN NEXT r; -- return current row of SELECT
    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;

SELECT * FROM getallfoo();
Run Code Online (Sandbox Code Playgroud)