Re: Letting a function return multiple columns instead of a single complex one - Mailing list pgsql-general

From a.j.langereis@inter.nl.net (A.j. Langereis)
Subject Re: Letting a function return multiple columns instead of a single complex one
Date
Msg-id dn7pbe$bau$1@sea.gmane.org
Whole thread Raw
In response to Letting a function return multiple columns instead of a single complex one  ("A.j. Langereis" <a.j.langereis@inter.nl.net>)
List pgsql-general
> test=# select c,(ff).* from (select bar.*,get_a_foo(c) as ff from
bar) b;
> c | a | b
> ---+---+---
> 1 | 1 | 2
> (1 row)
>
>
Tanks! that works great! It managed to get it even a bit more
simplified:
select bar.*, (get_a_foo(c)).* from bar;

> Not amazingly elegant, but it works.  Note that you need to beware
of
> the possibility that the subselect will get flattened, leading to
> multiple evaluations of your function.  This doesn't happen in this
> particular case because you declared the function as returning set,
> but if you don't then you'll need additional countermeasures.
>
> In general I'd suggest that this style of programming is forcing SQL
to
> do something SQL doesn't do very well, ie, emulate a functional
> language.  It's likely to end up both notationally ugly and very
> inefficient.  You should think hard about whether you can't express
your
> problem with views and joins instead.
>
>
The reason that I need this is because of my other question (is there
in pg
a function like oracle's rownum?). The function get_a_foo looks in
reality a
bit more like the next:

create type foo_extended as (a int, b int, rowno int);

create or replace function get_a_foo_func(int)
 returns setof foo_extended as
'
declare
tmp_row foo_extended%rowtype;
i int;
begin
i := 1;

for tmp_row in (select * from foo where a = $1) loop
 tmp_row.rowno := i;
 return next tmp_row;
 i := i + 1;
end loop;

end;
'
language plpgsql volatile;

create or replace function get_a_foo(int)
 returns setof foo_extended as
'
select * from get_a_foo_func($1);
'
language sql volatile;

The function get_a_foo_func runs a query and adds to each row of the
result
a rownum like number. The other, wrapper, function is to make it
possible to
give a set as an imput parameter: unfortunately this is something that
doesn't seem to be supported by pl/pgsql.

Yours,

Aarjan Langereis



---------------------------(end of
broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq


pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: Memory Leakage Problem
Next
From: hubert depesz lubaczewski
Date:
Subject: Re: tables with lots of columns - what alternative from performance point of view?