Re: plpython return setof and yield - Mailing list pgsql-general

From Nuno Mota
Subject Re: plpython return setof and yield
Date
Msg-id d79bf9b30908171043v8a91507xa7a064de62f78ab4@mail.gmail.com
Whole thread Raw
In response to Re: plpython return setof and yield  (Adrian Klaver <aklaver@comcast.net>)
Responses Re: plpython return setof and yield
List pgsql-general
Thank you very much,

Can i ask one more question ?

How do I declare the correct result set to return, this in first example code, is it possible ?

Thank you again,
Nuno Mota

On Mon, Aug 17, 2009 at 3:21 PM, Adrian Klaver <aklaver@comcast.net> wrote:
On Sunday 16 August 2009 5:13:51 pm Nuno Mota wrote:
> Hi,
>
> I am kind of new into python, and I have been trying to port some plperl
> functions into plpython, but I've run up into a problem.
>
> Imagine the following plpython code.
>
> CREATE OR REPLACE FUNCTION greet (how text)
>   RETURNS SETOF greeting
> AS $$
>   rv = plpy.execute("SELECT 1")
>
>   for article in range(10) :
>     for other in range(10) :
>         if (other == 1) : continue
>         yield([article,other])
> $$LANGUAGE plpythonu;
>
> When executing the function on the psql console I always the this error.
>
> netbo-dev=# select * from greet('Nuno');
> ERROR:  error fetching next item from iterator
>
> If I comment the first line:
>
> rv = plpy.execute("select 1")
>
> Turning the code into this:
>
> CREATE OR REPLACE FUNCTION greet (how text)
>   RETURNS SETOF greeting
> AS $$
>   #rv = plpy.execute("SELECT 1")
>
>   for article in range(10) :
>     for other in range(10) :
>         if (other == 1) : continue
>         yield([article,other])
> $$LANGUAGE plpythonu;
>
> The code works:
>
> netbo-dev=# select * from greet('Nuno');
>  how | who
> -----+-----
>  0   | 0
>  0   | 2
>  0   | 3
>  0   | 4
>  0   | 5
>  0   | 6
>
> I know the example code is not the best, but What I was tryng to do is
> execute some SQL then process it and return it back.
>
> I also know I could just generate the rows and place them in a list and
> then return it, but I would like to know why the yield function does'nt
> work in this case.
>
> This was tried on with:
>
> PostgreSQL 8.3.7 and Python 2.5.1
>
> Thanks,
> Nuno Mota

As a guess, in the first example you have the function creating two result sets
without declaring which one to return. In the second example you are using the
generator alone.

--
Adrian Klaver
aklaver@comcast.net



--
Nuno Mota <nmota@net-bo.com>

Management Solutions for POS
Tlf:  351 225322000
Mob:  351 936272176
Fax:  351 226177662
http://www.net-bo.com

pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: ERROR: attempted to delete invisible tuple
Next
From: Tom Lane
Date:
Subject: Re: pg_autovacuum exceptions question