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

-
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