Search code examples
sql-serverpostgresqlresultset

Postgresql stored procedure return select result set


In Microsoft SQL server I could do something like this :

create procedure my_procedure @argument1 int, @argument2 int
as
    select *
    from my_table
    where ID > @argument1 and ID < @argument2

And that would return me table with all columns from my_table.

Closest thing to that what I managed to do in postgresql is :

create or replace function
    get_test()
returns setof record
as
$$ select * from my_table $$
language sql

or i could define my table type, but manually recreating what technically already exists is very impractical.

create or replace function
    get_agent_summary()
returns table (
    column1 type, column2 type, ...
)
as
$$
begin
    return query select col1, col2, ... from my_existing_table;
...

and it is pain to maintain.

So, how can I easily return resultset without redefining defining every single column from table that I want to return?


Solution

  • In Postgres a table automatically defines the corresponding type:

    create or replace function select_my_table(argument1 int, argument2 int)
    returns setof my_table language sql as $$
        select *
        from my_table
        where id > argument1 and id < argument2;
    $$;
    
    select * from select_my_table(0, 2);
    

    The syntax is more verbose than in MS SQL Server because you can create functions in one of several languages and functions may be overloaded.