Re: Result sets from functions

From: Jeff Eckermann <jeff_eckermann(at)yahoo(dot)com>
To: steve boyle <boylesa(at)dial(dot)pipex(dot)com>, pgsql-sql(at)postgresql(dot)org
Subject: Re: Result sets from functions
Date: 2002-01-14 22:26:56
Message-ID: 20020114222656.9496.qmail@web20803.mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Two other possible ways to get resultsets (or
equivalent) from functions:
1. (Indirect solution) Make inserts to a table from
your function; do a separate select for the results
2. Have your function return a string which your
application can parse into records. Maybe: "RETURN
field1 || chr(9) || field2 || chr(10) || field3 ||
chr(9) || field4 || chr(10);

--- steve boyle <boylesa(at)dial(dot)pipex(dot)com> wrote:
> Kevin,
>
> AFAIK you cannot currently return resultsets from
> functions in Postgres. I
> remember seing something ages ago that suggested it
> may be added at some
> point but haven't seen anything since.
>
> The docs:
>
http://developer.postgresql.org/docs/postgres/xfunc-sql.html
> go
> through the current usage.
>
> The following shows how you can emulate the return
> of a resultset using SQL
> functions and the SQL IN operator (although I don't
> know how efficient it
> would be over large resultsets):
>
> drop table master;
> create table master (
> id int4,
> ma_val varchar(5),
> primary key(id)
> );
>
> drop table slave;
> drop sequence slave_slave_id_seq;
>
> create table slave (
> slave_id serial,
> fk_id int4,
> sl_val varchar(5),
> foreign key (fk_id) references master(id)
> );
>
> insert into master(id, ma_val) values(1, 'a');
> insert into master(id, ma_val) values(2, 'b');
> insert into master(id, ma_val) values(3, 'c');
>
> insert into slave(fk_id, sl_val) values(1, 'c1');
> insert into slave(fk_id, sl_val) values(1, 'c2');
> insert into slave(fk_id, sl_val) values(1, 'c3');
> insert into slave(fk_id, sl_val) values(2, 'c4');
> insert into slave(fk_id, sl_val) values(2, 'c5');
> insert into slave(fk_id, sl_val) values(3, 'c6');
>
> drop function f_spTest(int4);
>
> create function f_spTest(int) returns setof int as
> 'select slave_id as slave_id from slave where
> fk_id = $1;'
> language 'SQL';
>
> select * from slave where slave_id in (select
> f_sptest(1));
>
> One limitation with this is that you need to have a
> single key into the
> table your querying (but you could probably use the
> OID for this so it
> shouldn't be too much of a problem).
>
> hih
>
> sb
>
> "Kevin Zapico" <kevin(dot)zapico(at)viewgate(dot)com> wrote in
> message
> news:a1jiuh$2i2a$1(at)news(dot)tht(dot)net(dot)(dot)(dot)
> > I am new to postgres and am trying to get a
> function to return a result
> set
> > with multiple columns.
> >
> > The only way I have seen to do this so far is
> >
> > select column1(proc()), column2(proc())
> >
> > This looks like it should call the proc() function
> twice, although I am
> sure
> > that it does not. However, I am trying to find out
> if there is another way
> > of doing this.
> >
> > Please help.
> >
> >
>
>
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org

__________________________________________________
Do You Yahoo!?
Send FREE video emails in Yahoo! Mail!
http://promo.yahoo.com/videomail/

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Jochem van Dieten 2002-01-14 22:47:37 Re: Long-running DELETE...WHERE...
Previous Message Tom Lane 2002-01-14 22:01:55 Re: SQL Joins