Re: funcion no da error pero tampoco ejecuta funcion

From: Jaime Casanova <jaime(at)2ndquadrant(dot)com>
To: "jvenegasperu (dot)" <jvenegasperu(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: funcion no da error pero tampoco ejecuta funcion
Date: 2014-09-16 16:28:53
Message-ID: CAJKUy5gz4knUhO1nfqgK7BL+nYZC2s_UpHLwdOgOD9eey+2F3g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2014-09-16 9:29 GMT-05:00 jvenegasperu . <jvenegasperu(at)gmail(dot)com>:

> Hola buenos dias a todos
>
> tengo esta consulta
>
> select l.gid,st_centroid(st_intersection(v.the_geom,l.the_geom)),
> st_distance(st_centroid(st_intersection(v.the_geom,l.the_geom)),st_startpoint(v.the_geom))
> from cat_vias v join cat_lote l
> on st_intersects(v.the_geom,l.the_geom)
> where rotulo ilike 'RUTA1%'
>
> se ejecuta bien en pgadmin pero el problema es que:
>
> la columna que deberia reportar la distancia aparece vacia en el pgadmin
> no me marca nigun error.
>
>
Si buscas en pg_proc veras que las funciones st_distance(), st_centroid() y
st_startpoint() estan marcadas como strict (campo proisstrict = true) y al
menos algunas versiones de st_intersection() también.

Una función marcada como STRICT (la versión corta de decir RETURNS NULL ON
NULL INPUT,
http://www.postgresql.org/docs/current/static/sql-createfunction.html)
siempre retorna NULL si alguno de sus parametros es NULL sin ejecutar la
función.

Considera por ejemplo está función:
"""
create or replace function funcion_null( i int) returns float as $$
begin
return 1/0;
end;
$$ language plpgsql;
"""

al no indicar nada de forma predeterminada la función se ejecuta siempre
sin importar los parámetros. En este caso siempre me dará un error sin
importar los parámetros que pase por que no los estoy usando.

select funcion_null(1);
select funcion_null(null);

ambos dan el mismo error:
"""
ERROR: división por cero
CONTEXTO: sentencia SQL: «SELECT 1/0»
PL/pgSQL function funcion_null(integer) line 1 at RETURN
"""

pero si reconstruyo la función asi:
"""
create or replace function funcion_null( i int) returns float as $$
begin
return 1/0;
end;
$$ language plpgsql strict;
"""

al ejecutar "select funcio_null(null)" veras que no da error, sino que
retorna NULL.
La función nunca se ejecuta porque uno de los parámetros es NULL y por lo
tanto
la función retorna NULL enseguida.

En conclusión, uno de los parámetros que estas pasando a alguna de las
funciones mencionadas arriba es NULL

--
Jaime Casanova www.2ndQuadrant.com
Professional PostgreSQL: Soporte 24x7 y capacitación
Phone: +593 4 5107566 Cell: +593 987171157

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Guillermo E. Villanueva 2014-09-16 19:15:14 Re: funcion no da error pero tampoco ejecuta funcion
Previous Message jvenegasperu . 2014-09-16 14:29:07 funcion no da error pero tampoco ejecuta funcion