Re: Creando funciones

From: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
To: Jorge Tornero <jorge(dot)tornero(at)cd(dot)ieo(dot)es>
Cc: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Creando funciones
Date: 2010-05-27 15:55:06
Message-ID: AANLkTikahtL4O6gZ7Q-BC5tJqtxAU17jT_FfRvnTeCXb@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Jorge, creo que la complicación que tenes es porque tu función es de tipo
TABLE, entonces la forma de llamarla es a través de un select
Por favor, probá lo que yo te decía antes:
select (select A, B, R2 from regresion(b.talla,b.peso)) from biologicos b

Saludos

~~~~~~~~~~~~~~~~
Guillermo Villanueva

El 27 de mayo de 2010 12:19, Jorge Tornero <jorge(dot)tornero(at)cd(dot)ieo(dot)es>escribió:

> Hola a todos,
>
> Bueno, gracias, lo primero, por las respuestas que van llegando. En cuanto
> a lo que menciona Miguel, eso es cierto (de hecho la función funciona con
> float) y se debe a un fallo porque pegué mal la función, vamos que pegué una
> de prueba que se diferenciaba en lo de double y está subsanado,con lo que la
> función devuelve un valor si se la llama de la manera que describe Miguel es
> decir, en plan select regreson (1,2). Pero esto no tiene sentido, ya que las
> regresiones se calculan sobre un conjunto de datos. Mi problema es que si
> hacemos, por ejempo:
>
> CREATE TABLE prueba (talla int, peso numeric(5,2), fecha date);
>
> metemos varios datos en su interior y hacemos
>
> SELECT regresion(talla,peso) from prueba;
>
> lo que ocurre es que me hace la función regresión sobre cada una de las
> tuplas de la consulta. Es decir, no se comporta como un agregado (por
> ejemplo, tal y como se comporta la funcion max() o min() o sin ir más lejos
> cualquiera de las que he empleado yo en la función).
>
> Con lo cual no me sirve para nada. La verdad, estoy un poco anonadado
> porque me parece una cosa un poco trivial, en el sentido de que es casi com
> si fuera una "macro", más que una función.
>
> Me han sugerido crear un agregado con CREATE AGGREGATE, pero claro, el
> problema es que sólo retorna un valor, entre otros problemillas.
>
> Bueno, seguimos en el "ajo". Un saludo y gracias
>
>
> Jorge Tornero
>
> Centro Oceanográfico de Cádiz
> Instituto Español de Oceanografía
> Muelle de Levante, s/n
> Puerto Pesquero - Cadiz
>
>
>
> -----Mensaje original-----
> De: pgsql-es-ayuda-owner(at)postgresql(dot)org en nombre de Miguel Rodríguez
> Penabad
> Enviado el: jue 27/05/2010 16:08
> Para: foro postgresql
> Asunto: Re: [pgsql-es-ayuda] Creando funciones
>
>
> Nada, olvida mi correo anterior. Conté mal los paréntesis y pensé que
> debería devolver un único valor.
>
> El problema que vi tratando de reproducir tu "create function"
> es que el tipo de datos "double" no existe, es "double precision".
>
> Así, probando:
>
> => drop function regresion(int,numeric);
> DROP FUNCTION
> penabad=> CREATE FUNCTION regresion(int,numeric) RETURNS TABLE(A
> double precision, B double precision,
> R2 double precision)
> AS $$select
>
> exp(regr_intercept(ln($2),ln($1/10.0))),regr_slope(ln($2),ln($1/10.0)),regr_r2(ln($2),ln($1/10.0))$$
> LANGUAGE SQL;
> CREATE FUNCTION
>
> => select regresion(1,2);
> regresion
> -----------------------------------------
> (1.09770357551321,-0.260946327683616,1)
> (1 row)
>
> Como no tengo idea de lo que devuelven esas funciones de regresión, no
> sé si es lo que quieres, pero al menos devuelve algo ;)
>
> Saludos
>
> --
> Miguel Rodríguez Penabad
> -
> 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
>
>
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message alvherre 2010-05-27 17:20:35 Re: Conversion UTF8 - WIN1252 en campos binarios ?
Previous Message alvherre 2010-05-27 15:44:26 Re: Creando funciones