tengo funciones parecidas en algunas bd, la diferencia para que te devuelva datos al estilo (dato,dato,dato) (dato1,dato1,dato1) o una tabla | dato | dato | dato | dato | dato | dato
es solo la forma de llamar a la consulta el primero ejemplo te lo devuelve al llamarlo select funcion(parametro) y te devuelve tablas al llamarlo select * from funcion(parametro). desde el lenguaje que llamas a la funcion deberias de utilizar la segunda forma. yo llamo a mis funciones asi. desde java y los carga en un resultset tal cual haria un simple select a una tabla de bd. 2013/4/18 Jorge Tornero - Listas <jtorlis...@gmail.com> > El 18/04/13 14:17, Martín Marqués escribió: > > El día 18 de abril de 2013 04:01, Jorge Tornero - Listas >> <jtorlis...@gmail.com> escribió: >> >>> Estimados usuarios de la lista: >>> >>> Con la idea de no tener que repetir sistemáticamente una consulta >>> bastante >>> larga, la he introducido en el interior de una función de manera que sólo >>> necesito invocarla con uno o dos parámetros para obtener el resultado >>> deseado. La función es: >>> >>> CREATE OR REPLACE FUNCTION difbpm(mes int,puer varchar,espc varchar >>> default >>> '10156',espec varchar default 'ANE') >>> RETURNS TABLE(barco varchar,peso_sireno numeric,peso_hventa numeric, >>> diferencia numeric) >>> AS $$ >>> BEGIN >>> RETUNR QUERY >>> WITH >>> sireno as( >>> SELECT >>> bardes as barco, >>> sum(pvivo) as peso >>> from cap2012 >>> WHERE >>> mes(fecha)=$1 >>> and puedes=$2 >>> and espcod=$3 >>> GROUP BY 1 >>> ), >>> hojas as( >>> SELECT >>> nombre_buque as barco, >>> sum(pesoventa) as peso >>> from hventa >>> WHERE >>> al3=$4 >>> and puerto_desembarque=$2 >>> and mes(fecha_venta)=$1 >>> GROUP BY 1) >>> >>> SELECT >>> sireno.barco as barco, >>> sireno.peso as peso_sireno, >>> hojas.peso as peso_hventa, >>> sireno.peso-hojas.peso as diferencia >>> FROM >>> sireno,hojas >>> WHERE >>> sireno.barco=hojas.barco and >>> sireno.peso!=hojas.peso >>> order by 1; >>> END; >>> $$ >>> LANGUAGE 'plpgsql'; >>> >>> Ahora bien, si yo simplemente invoco la función como; >>> >>> triki-triki=# select difbpm(7,'NUEVA YORK'); >>> >>> Obtengo como resultado: >>> >>> difbpm >>> ------------------------------**--------------------- >>> ("EL CHUBASCO",378.000,644.00,-266.**000) >>> ("EL COMIA",13601.000,13979.00,-**378.000) >>> ("NUEVO SIRENA MAR",16737.000,18123.00,-1386.**000) >>> >>> En lugar de la versión más apropiada que obtengo mediante >>> >>> triki-triki=# select * from difbpm(7,'NUEVA YORK'); >>> >>> barco | peso_sireno | peso_hventa | diferencia >>> ------------------+-----------**--+-------------+------------ >>> EL CHUBASCO | 378.000 | 644.00 | -266.000 >>> EL COMIA | 13601.000 | 13979.00 | -378.000 >>> NUEVO SIRENA MAR | 16737.000 | 18123.00 | -1386.000 >>> >>> He estado mirando en google pero creo que, en principio, he hecho las >>> cosas >>> correctamente, no sé si existe alguna manera de que la función devuelva >>> la >>> tabla pura y dura, en lugar de esa suerte de tupla en bruto. >>> ¿Existe alguna solución? >>> >> Que significa para vos SELECT difbpm(7,'NUEVA YORK');? Digo, pensado >> desde el punto de vista del lenguaje SQL, es distinto a SELECT * FROM >> tabla;. >> >> >> >> >> -- >> Martín Marqués >> select 'martin.marques' || '@' || 'gmail.com' >> DBA, Programador, Administrador >> > > Estimado Martín: > > Gracias por tu interés. Quizá por viciado desde otros lenguajes de > programación, para mí > > > SELECT difbpm(7,'NUEVA YORK') > > > significaría que ejecutara esa función, que como yo al programarla le digo > que me retorne la consulta y además le indico que el tipo de retorno es > tabla, lo que espero es que me devuelva una tabla, no una serie de (así se > llamaría en python, más o menos) tupla (o sea, los valores de los distintos > campos separados por coma y entre paréntesis) > > Es muy posible que tenga yo un lío de conceptos. Pero no me queda claro, > de ahí la solicitud de ayuda. > > Muchas gracias > > Jorge Tornero > > > > - > Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org > **) > Para cambiar tu suscripción: > http://www.postgresql.org/**mailpref/pgsql-es-ayuda<http://www.postgresql.org/mailpref/pgsql-es-ayuda> > -- Solo alcanzaras el conocimiento conociendo la ignorancia.