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