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

Responder a