From: | Jeff Adams <Jeff(dot)Adams(at)noaa(dot)gov> |
---|---|
To: | 'Albe Laurenz' <laurenz(dot)albe(at)wien(dot)gv(dot)at>, pgsql-general(at)postgresql(dot)org |
Subject: | Re: Sending Results From One Function As Input into Another Function |
Date: | 2011-09-27 14:41:54 |
Message-ID: | 003001cc7d23$99c9d350$cd5d79f0$%Adams@noaa.gov |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Thanks for the response Laurenz. I will give it a go...
Jeff
-----Original Message-----
From: Albe Laurenz [mailto:laurenz(dot)albe(at)wien(dot)gv(dot)at]
Sent: Monday, September 26, 2011 7:50 AM
To: Jeff Adams *EXTERN*; pgsql-general(at)postgresql(dot)org
Subject: RE: [GENERAL] Sending Results From One Function As Input into
Another Function
Jeff Adams wrote:
> I need to send the results (SETOF RECORDS) from one function into
another
> function, to produce another result (SETOF RECORDS). I am not quite
sure how
> to do get this done. The first function filters a large table down a
more
> manageable dataset. I want to send the results of this first function
to
> another function, where computations are performed. I could combine
into a
> single function, but I would lose some flexibility that I would like
to
> maintain by keeping the two functions separate. Preliminary research
> suggests that cursors might be the way to go, but I am not too
experienced
> with the use of cursors and was unable to find good examples. Any help
would
> be greatly appreciated...
Here's an example:
SELECT * FROM test;
id | val
----+-------
1 | one
2 | two
3 | three
4 | four
(4 rows)
CREATE FUNCTION filter() RETURNS refcursor
LANGUAGE plpgsql STABLE STRICT AS
$$DECLARE
/* assignment gives the cursor a name */
curs refcursor := 'curs';
BEGIN
OPEN curs FOR
SELECT id, val FROM test WHERE id%2=0;
RETURN curs;
END;$$;
CREATE FUNCTION compute(curs refcursor) RETURNS text
LANGUAGE plpgsql STABLE STRICT AS
$$DECLARE
v test; -- row type for table
r text := '';
BEGIN
LOOP
FETCH curs INTO v;
EXIT WHEN v IS NULL;
r := r || v.val;
END LOOP;
RETURN r;
END;$$;
SELECT compute(filter());
compute
---------
twofour
(1 row)
Yours,
Laurenz Albe
From | Date | Subject | |
---|---|---|---|
Next Message | planas | 2011-09-27 14:53:47 | Re: Download States and Capitals Database |
Previous Message | pasman pasmański | 2011-09-27 14:39:50 | Re: New feature: accumulative functions. |