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

8mmmxcuj  于 2023-02-12  发布在  PostgreSQL
关注(0)|答案(3)|浏览(187)

我有一个名为person的表,其中有id,name,status,我想返回行作为一个函数的结果与1参数(名称)。有人能帮助我吗?请让它容易,因为我很noob在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函数,但是如果我想要一个行列表,我该怎么做呢?

guicsvcw

guicsvcw1#

我知道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
(Edit添加正式文件):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();
0tdrvxhp

0tdrvxhp2#

使用循环返回查询结果速度慢、效率低,甚至不需要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而不是循环:
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');
qij5mzcb

qij5mzcb3#

很多答案都忽略了使用函数的重要部分,下面是一个更新后的postgres函数使用方法(包括声明、变量、参数、返回值和运行),下面是一个用"hello world"更新右下角"blurb"的例子。
| id(序列号)|发布标识(文本)|推特(文本)|
| - ------|- ------|- ------|
| 1个|美国广播公司|你好世界|
| 第二章|定义|导语|

-- Optional drop if replace fails below.
drop function if exists sync_tweets(text, text);

create or replace function sync_tweets(
    src_pub_id text, -- function arguments
    dst_pub_id text
) returns setof tweets as -- i.e. rows. int, text work too
$$
declare
    src_id    int; -- temp function variables (not args)
    dest_id   int;
    src_tweet text;
begin
    -- query result into a temp variable
    src_id := (select id from tweets where pub_id = src_pub_id);

    -- query result into a temp variable (another way)
    select tweet into src_tweet from tweets where id = src_id;

    dest_id := (select id from tweets where pub_id = dst_pub_id);
    update tweets set tweet=src_tweet where id = dest_id;

    return query -- i.e. rows, return 0 with return int above works too
        select * from tweets where pub_id in (src_pub_id, dst_pub_id);
end
$$ language plpgsql; -- need the language to avoid ERROR 42P13

-- Run it!
select * from sync_tweets('abc', 'def');

/*
  Outputs
   __________________________________________________ 
  |  id (serial)  |  pub_id (text)  |  tweet (text)  |
  |---------------|-----------------|----------------|
  |  1            |  abc            |  hello world   |
  |  2            |  def            |  blurb         |
  --------------------------------------------------
*/

相关问题