3

I've tried following tutorials for many times but failed. Could someone give me some examples please? Here is my code, it prompts that "ERROR:invalid type name 'SETOF RECORD'"

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;
1
  • 3
    What is the error you get? What exactly are you trying to do? (edit your question, do not post additional information in comments) Commented Apr 11, 2017 at 8:27

1 Answer 1

14

Ways to declare set returning function that I remember at the moment:

--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()
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks. And what should I do when I need to decide if the query result exists? What I want to do is that when it exists then return it, otherwise return result of another query.
Possibly FULL JOIN, UNION or DISTINCT ON would work, depending on query. I think that it doesn't have anything to do with function declaration. You can't store SETOF RECORD in variable.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.