Re: [pgsql-es-ayuda] Función que retorna tabla

From: Martín Marqués <martin(dot)marques(at)gmail(dot)com>
To: Jorge Tornero - Listas <jtorlistas(at)gmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] Función que retorna tabla
Date: 2013-04-18 12:17:21
Message-ID: CABeG9LtwFKsuw9nLZF9B5i5bGyj11g9OV=d2j4Ys1jktZG9NJQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 18 de abril de 2013 04:01, Jorge Tornero - Listas
<jtorlistas(at)gmail(dot)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(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Crispin T. 2013-04-18 13:25:46 Re: [pgsql-es-ayuda] Función que retorna tabla
Previous Message Jorge Tornero - Listas 2013-04-18 07:01:21 Función que retorna tabla