Re: Función que retorna tabla

From: Jorge Tornero - Listas <jtorlistas(at)gmail(dot)com>
To:
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Función que retorna tabla
Date: 2013-04-18 14:17:27
Message-ID: 51700077.1070301@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El 18/04/13 14:17, Martín Marqués escribió:
> 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

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(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 Kernel 2013-04-18 16:32:03 control de actividad por usuario/Aplicacion
Previous Message Crispin T. 2013-04-18 13:25:46 Re: [pgsql-es-ayuda] Función que retorna tabla