Re: how to return parts of records from a function - Mailing list pgsql-general

From Craig Ringer
Subject Re: how to return parts of records from a function
Date
Msg-id 482EA5EC.1090402@postnewspapers.com.au
Whole thread Raw
In response to how to return parts of records from a function  ("A B" <gentosaker@gmail.com>)
List pgsql-general
A B wrote:
> Hello.
> I think I need som help on this function I write in plpgsql
> I want to return
> CREATE OR REPLACE FUNCTION gList(tid_ TIMESTAMP) RETURNS AS $$
> DECLARE
>     rec RECORD;
> BEGIN
>     FOR rec IN SELECT DISTINCT custid,action,nr FROM ...
>         IF rec.action = ...
>         END IF;
>         RETURN NEXT  ???????????????
>     END LOOP;
>     RETURN;
> END;
> $$ LANGUAGE plpgsql;
>
> I want to replace the ????????? with  something that will contain both
> rec.nr  and rec.action. What should that looklike?  rec.nr ,
> rec.action  ?

Declare another RECORD for the return value, then assign to its fields
with the := operator. If you add the following in your DECLARE block:

    retval RECORD;

then use:

    retval.nr := rec.nr;
    retval.action := rec.action;

you can RETURN NEXT retval.

If you have lots of values to return you can use a row constructor:

    retval := row(rec.nr, rec.action)
    return next retval;

It's also possible to do the same job using a function that has OUT
parameters, but the record approach should be fine for you.

> And what should I write after RETURNS ....  in the first line? RECORD?

SETOF RECORD

> Oh, now that I write this I understand that I could replace the RETURN
> NEXT in the loop with a single RETURN QUERY at the end... I don't know
> if that will be good, but I still would like to know how to return the
> separate fields from the rec  record.

Depending on the contents of your `IF rec.action' you might able to
rewrite the whole thing as single SQL statement (using CASE instead of
IF) and wrap it up in an SQL stored procedure.

Otherwise RETURN QUERY won't do you much good, because you need to step
through the results of the query and do something with them.

--
Craig Ringer

pgsql-general by date:

Previous
From: Craig Ringer
Date:
Subject: Re: migration problem
Next
From: "Leif B. Kristensen"
Date:
Subject: Re: writing a function without installing a language