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

From: "Crispin T(dot)" <cris(dot)emis(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 13:25:46
Message-ID: CAMb9RiMs5hHboR7ny44Q7ydhWuBxCVtxMU4YCe0fa7MAxYANMQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

tengo funciones parecidas en algunas bd, la diferencia para que te devuelva
datos al estilo
(dato,dato,dato)
(dato1,dato1,dato1)
o una tabla
| dato | dato | dato
| dato | dato | dato

es solo la forma de llamar a la consulta el primero ejemplo te lo devuelve
al llamarlo select funcion(parametro) y te devuelve tablas al llamarlo
select * from funcion(parametro).

desde el lenguaje que llamas a la funcion deberias de utilizar la segunda
forma. yo llamo a mis funciones asi. desde java y los carga en un resultset
tal cual haria un simple select a una tabla de bd.

2013/4/18 Jorge Tornero - Listas <jtorlistas(at)gmail(dot)com>

> 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 suscripción:
> http://www.postgresql.org/**mailpref/pgsql-es-ayuda<http://www.postgresql.org/mailpref/pgsql-es-ayuda>
>

--
Solo alcanzaras el conocimiento conociendo la ignorancia.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jorge Tornero - Listas 2013-04-18 14:17:27 Re: Función que retorna tabla
Previous Message Martín Marqués 2013-04-18 12:17:21 Re: [pgsql-es-ayuda] Función que retorna tabla