Sunday, 15 February 2015

postgresql - Calling set-returning function with each element in array -



postgresql - Calling set-returning function with each element in array -

i have set-returning function (srf) accepts integer argument , returns set of rows table. phone call using select * tst.mysrf(3);, , manipulate returned value if table.

what execute on each element of array; however, when phone call using select * tst.mysrf(unnest(array[3,4]));, error returned "set-valued function called in context cannot take set". if instead phone call using select tst.mysrf(unnest(array[3,4]));, set of type tst.tbl.

table definition:

drop table tst.tbl cascade; create table tst.tbl ( id serial not null, txt text not null, primary key (id) ); insert tst.tbl(txt) values ('a'), ('b'), ('c'), ('d');

function definition:

create or replace function tst.mysrf( in p_id integer ) returns setof tst.tbl language plpgsql $body$ declare begin homecoming query select id, txt tst.tbl id = p_id; end; $body$;

calls:

select * tst.mysrf(3) returns table, expected. select tst.mysrf(unnest(array[3,4])) returns table single column of type tst.tbl, expected. select * tst.mysrf(unnest(array[3,4])) returns error described above, had expected table.

to avoid "table of single column" problem, need explicitly expand srf results (row).* notation

select (tst.mysrf(unnest(array[3,4]))).*;

if understood @depesz, lateral provide more efficient or straightforward way accomplish same result.

postgresql plpgsql

No comments:

Post a Comment