7

我有一个名为的表personid,name,status我想返回行作为具有 1 个参数(名称)的函数的结果。谁能帮我?请让它变得简单,因为我在 PostgreSQL 中很菜鸟。

这是我的正常功能代码

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

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

4

2 回答 2

8

我知道 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();
于 2013-03-31T05:18:03.970 回答
5

使用循环返回查询结果既慢又低效。这甚至不需要 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;

如果需要 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;

然后使用以下命令调用它:

select *
from fn_list('Arthur');
于 2018-09-12T05:57:26.540 回答