Received: from localhost (unknown [200.46.208.211]) by mail.postgresql.org (Postfix) with ESMTP id 7D1F4635531 for ; Fri, 3 Apr 2009 13:59:19 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.208.211]) (amavisd-maia, port 10024) with ESMTP id 67135-02 for ; Fri, 3 Apr 2009 13:59:16 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from QMTA01.emeryville.ca.mail.comcast.net (qmta01.emeryville.ca.mail.comcast.net [76.96.30.16]) by mail.postgresql.org (Postfix) with ESMTP id 73725635140 for ; Fri, 3 Apr 2009 13:59:17 -0300 (ADT) Received: from OMTA02.emeryville.ca.mail.comcast.net ([76.96.30.19]) by QMTA01.emeryville.ca.mail.comcast.net with comcast id b0QZ1b0010QkzPwA14ykYP; Fri, 03 Apr 2009 16:58:44 +0000 Received: from sz0030.ev.mail.comcast.net ([76.96.26.80]) by OMTA02.emeryville.ca.mail.comcast.net with comcast id b4zG1b00X1jhnB88N4zGxC; Fri, 03 Apr 2009 16:59:17 +0000 Date: Fri, 3 Apr 2009 16:59:16 +0000 (UTC) From: Adrian Klaver To: peterw@borstad.com Cc: pgsql-sql@postgresql.org Message-ID: <1381545833.2939121238777956737.JavaMail.root@sz0030a.emeryville.ca.mail.comcast.net> In-Reply-To: <49D62B3F.9030007@borstad.com> Subject: Re: FUNCTION problem MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [66.224.233.230] X-Mailer: Zimbra 5.0.11_GA_2730.RHEL5_64 (ZimbraWebClient - FF3.0 (Linux)/5.0.11_GA_2730.RHEL5_64) X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests=none X-Spam-Level: X-Archive-Number: 200904/34 X-Sequence-Number: 32380 ----- "Peter Willis" wrote: > Adrian Klaver wrote: > > On Friday 03 April 2009 6:51:05 am Adrian Klaver wrote: > >> On Thursday 02 April 2009 6:16:44 pm Adrian Klaver wrote: > >>> Now I remember. Its something that trips me up, the RECORD in > RETURN > >>> setof RECORD is not the same thing as the RECORD in DECLARE > RECORD. See > >>> below for a better explanation- > >>> > http://www.postgresql.org/docs/8.3/interactive/plpgsql-declarations.html# > >>> PL PGSQL-DECLARATION-RECORDS Note that RECORD is not a true data > type, > >>> only a placeholder. One should also realize that when a PL/pgSQL > function > >>> is declared to return type record, this is not quite the same > concept as > >>> a record variable, even though such a function might use a record > >>> variable to hold its result. In both cases the actual row > structure is > >>> unknown when the function is written, but for a function returning > record > >>> the actual structure is determined when the calling query is > parsed, > >>> whereas a record variable can change its row structure > on-the-fly. > >>> > >>> > >>> > >>> -- > >>> Adrian Klaver > >>> aklaver@comcast.net > >> For this particular case the following works. > >> > >> CREATE OR REPLACE FUNCTION test_function(integer) RETURNS record > >> AS $Body$ > >> DECLARE croid integer; > >> DECLARE R RECORD; > >> BEGIN > >> SELECT INTO croid 2; > >> SELECT INTO R croid,$1; > >> RETURN R; > >> END; > >> > >> $Body$ > >> LANGUAGE plpgsql; > >> > >> -- > >> Adrian Klaver > >> aklaver@comcast.net > > > > Forgot to show how to call it. > > > > test=# SELECT * from test_function(1) as test(c1 int,c2 int); > > c1 | c2 > > ----+---- > > 2 | 1 > > (1 row) > > > > > > Ah!, I see what you mean about the definition of 'RECORD'. > (The lights come on...) > > And here I thought it would all be so simple..... > > You show a valid, and most informative solution. > This should get things working for me. If you are using Postgres 8.1+ then it becomes even easier because you can use OUT parameters in the function argument list to eliminate the "as test(c1 int,c2 int)" clause. At this point it becomes a A-->B-->C problem i.e determine what your inputs are, how you want to process them and how you want to return the output. > > Thank you very much for your help. > > Peter Adrian Klaver aklaver@comcast.net