Retornar registros plpython

FERNANDO VILLARROEL fvillarroel en yahoo.com
Vie Abr 7 16:21:23 CEST 2006


> Sería lo mismo, pero cambiando el tipo de dato que
> retorna para indicar que es 
> un conjunto:
> 
> create or replace function cli() returns setof text
> as '
> ...
> 
>
Hola probe con las siguientes funcionea segun lo que
me rocomendo Chema, pero la funcion se queda colgada y
no termina hasta que yo la
quiebre con un Ctrl C ;

prueba=# drop function cli();
DROP FUNCTION
prueba=# \i ejem5.sql
CREATE FUNCTION
prueba=# select cli();
Cancel request sent
ERROR:  cancelando consulta debido a una petición del
usuario
prueba=#

Y la funcion la redefini segun lo sugerido quedando
asi;

create or replace function cli() returns setof text as
'
plan = plpy.prepare("SELECT rut ,nombre  FROM uno ")

rv = plpy.execute(plan)

return [ (r["rut"],r["nombre"]) for r in rv]

'
LANGUAGE 'plpythonu';

 
> Si lo quieres más refinado, puedes crearte un tipo
> de dato propio:
> 
> -- Por ejemplo...
> create type compuesto as (rut char(20), nombre
text);
> 
> create or replace function cli() returns setof
> compuesto as '
>   plan = plpy.prepare("SELECT rut ,nombre  FROM uno
> ")
>   rv = plpy.execute(plan)
> 
>   return [ (r["rut"],r["nombre"]) for r in rv]
> '
> LANGUAGE 'plpythonu';

El segundo metodo tambien me fallo;

prueba=# create type compuesto as (rut int4, nombre
varchar(20));
CREATE TYPE

prueba=# \i ejem6.sql
CREATE FUNCTION
prueba=# select cli2();
ERROR:  tuple return types are not supported yet
prueba=#

create or replace function cli2() returns setof 
compuesto as '
   plan = plpy.prepare("SELECT rut ,nombre  FROM uno")
   rv = plpy.execute(plan)

   return [ (r["rut"],r["nombre"]) for r in rv]
 '
LANGUAGE 'plpythonu';


> ######
> NOTA: A partir del postgresql 8.x las SRFs funcionan
> de otra manera, más 
> parecidas a los generadores de python. En la versión
> 8.1 es preciso parchear 
> el postgresql:

He indagagado mas al respecto mas precisamente en la
lista de Postgresql y me han contestado que esto
(returns setof) no esta implementado en Postgres para
plpython, me recomiendan hecharle un vistazo a plperl,
pero no me interesa pues mi ambito es Python.

Existe algun truco para hacer esto, como por ejemplo
con los diccionarios SD y GD?

Agradecere sus consejos, ya que lo que necesito es
retornar registros desde mi funcion plpython.
Saludos Fernando.



__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 




Más información sobre la lista de distribución Python-es