Received: from localhost (unknown [200.46.204.183]) by mail.postgresql.org (Postfix) with ESMTP id 1BD866331C5 for ; Thu, 2 Apr 2009 13:10:09 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 65924-09 for ; Thu, 2 Apr 2009 13:10:01 -0300 (ADT) X-Greylist: delayed 16:37:58.184572 by SQLgrey-1.7.6 Received: from smtp2.islandnet.com (smtp2.islandnet.com [199.175.106.101]) by mail.postgresql.org (Postfix) with ESMTP id 6D432632F09 for ; Thu, 2 Apr 2009 13:10:00 -0300 (ADT) Received: from [199.175.106.51] (port=39572 helo=cluster.islandnet.com) by smtpout.islandnet.com with ESMTP id 1LpPUL-000ARx-H5 ; Thu, 02 Apr 2009 09:09:57 -0700 Received: from [24.108.1.50] (port=1443 helo=[192.168.0.193]) by cluster02.islandnet.com with ESMTPSA (TLSv1:AES256-SHA:256) id 1LpPUL-0004jk-7m ; Thu, 02 Apr 2009 09:09:57 -0700 Message-ID: <49D4E354.9090106@borstad.com> Date: Thu, 02 Apr 2009 09:09:56 -0700 From: Peter Willis Reply-To: peterw@borstad.com User-Agent: Thunderbird 2.0.0.21 (Windows/20090302) MIME-Version: 1.0 To: Adrian Klaver CC: pgsql-sql@postgresql.org Subject: Re: FUNCTION problem References: <49D3F948.4060908@borstad.com> <200904011655.58801.aklaver@comcast.net> In-Reply-To: <200904011655.58801.aklaver@comcast.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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/15 X-Sequence-Number: 32361 Adrian Klaver wrote: > On Wednesday 01 April 2009 4:31:20 pm Peter Willis wrote: >> Hello, >> >> I am having a problem with a FUNCTION. >> The function creates just fine with no errors. >> >> However, when I call the function postgres produces an error. >> >> Perhaps someone can enlighten me. >> >> >> --I can reproduce the error by making a test function >> --that is much easier to follow that the original: >> >> CREATE OR REPLACE FUNCTION test_function(integer) >> RETURNS SETOF RECORD AS >> $BODY$ >> DECLARE croid integer; >> BEGIN >> >> --PERFORM A SMALL CALCULATION >> --DOESNT SEEM TO MATTER WHAT IT IS >> >> SELECT INTO croid 2; >> >> --A SELECT STATEMENT OUTPUTS RECORDS (one in this case) >> SELECT croid,$1; >> END; >> >> $BODY$ >> LANGUAGE 'plpgsql' VOLATILE >> >> >> >> >> --The call looks like the following: >> >> SELECT test_function(1); >> >> >> >> >> >> --The resulting error reads as follows: >> >> ERROR: query has no destination for result data >> HINT: If you want to discard the results of a SELECT, use PERFORM instead. >> CONTEXT: PL/pgSQL function "test_function" line 5 at SQL statement >> >> ********** Error ********** >> >> ERROR: query has no destination for result data >> SQL state: 42601 >> Hint: If you want to discard the results of a SELECT, use PERFORM instead. >> Context: PL/pgSQL function "test_function" line 5 at SQL statement > > You have declared function to RETURN SETOF. In order for that to work you need > to do RETURN NEXT. See below for difference between RETURN and RETURN NEXT: > http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-CONTROL-STRUCTURES-LOOPS > > Thank you for the pointer. I tried using FOR/RETURN NEXT as suggested but now get a different error: CREATE OR REPLACE FUNCTION test_function(integer) RETURNS SETOF record AS $BODY$ DECLARE croid integer; DECLARE R RECORD; BEGIN SELECT INTO croid 2; FOR R IN SELECT croid,$1 LOOP RETURN NEXT R; END LOOP; RETURN; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE There is now an error : ERROR: set-valued function called in context that cannot accept a set CONTEXT: PL/pgSQL function "test_function" line 7 at RETURN NEXT ********** Error ********** ERROR: set-valued function called in context that cannot accept a set SQL state: 0A000 Context: PL/pgSQL function "test_function" line 7 at RETURN NEXT PostgreSQL doesn't seem to see 'R' as being a SET OF RECORD.... Peter