2017-04-11 102 views
0

我已经尝试了很多次以下的教程,但失败了。 有人可以给我一些例子吗? 这里是我的代码,它提示说:“错误:无效的类型名称‘SETOF记录’”如何在PostgreSQL的函数中返回查询结果的行?

create or replace function find() returns SETOF RECORD 
as $$ 
declare A SETOF RECORD; 
begin 
    A=(
     select x,y 
     from ....... 

    ) 
    CASE WHEN EXISTS A 
    THEN returns query A 
    ELSE returns query (
     select x,y 
     from ...... 
    ) 
    END; 

end; 
$$ language plpgsql; 
+2

什么是错误你得到?你究竟想要做什么? (** [编辑] **您的问题,请不要在评论中发布其他信息) –

回答

1

方式来声明集返回函数,我记得的时刻:

--example 1 
create or replace function test() returns SETOF RECORD 
as $$ 
begin 
    RETURN QUERY SELECT * FROM generate_series(1,100); 
end; 
$$ language plpgsql; 
--test output 
select * from test() AS a(b integer) 

--example 2 
create or replace function test2() returns TABLE (b integer) 
as $$ 
begin 
    RETURN QUERY SELECT * FROM generate_series(1,100); 
end; 
$$ language plpgsql; 
--test output 
select * from test2() 

--example 3 
create or replace function test3() returns SETOF RECORD 
as $$ 
declare 
    r record; 
begin 
    FOR r IN SELECT * FROM generate_series(1,100) LOOP 
     RETURN NEXT r; 
    END LOOP; 
end; 
$$ language plpgsql; 
--test output 
select * from test3() AS a(b integer); 

--example 4 
create or replace function test4() returns setof record 
as $$ 
    SELECT * FROM generate_series(1,100) 
$$ language sql; 
--test output 
select * from test4() AS a(b integer); 

--example 5 
create or replace function test5() returns setof integer 
as $$ 
begin 
    RETURN QUERY SELECT * FROM generate_series(1,100); 
end; 
$$ language plpgsql; 
--test output 
select * from test5() 

--example 6 
create or replace function test6(OUT b integer, OUT c integer) RETURNS SETOF record 
as $$ 
begin 
    RETURN QUERY SELECT b.b, b.b+3 AS c FROM generate_series(1,100) AS b(b); 
end; 
$$ language plpgsql; 
--test output 
select * from test6() 
+0

谢谢。当我需要确定查询结果是否存在时该怎么办?我想要做的是当它存在时返回它,否则返回另一个查询的结果。 – Chen

+0

根据查询情况,可能是'FULL JOIN','UNION'或'DISTINCT ON'。我认为它与函数声明没有任何关系。您__ can't__不能将'SETOF RECORD'存储在变量中。 –