Re: Problema con IF N=?ISO-8859-1?Q?OT_FOUND_en_funci=F3?=n plpgsql

From: Sebastián Villalba <sebastian(at)fcm(dot)unc(dot)edu(dot)ar>
To: "Jaime Casanova" <systemguards(at)gmail(dot)com>
Cc: "Lista Ayuda Pgsql" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problema con IF N=?ISO-8859-1?Q?OT_FOUND_en_funci=F3?=n plpgsql
Date: 2006-04-19 14:19:36
Message-ID: 20060419102126.M7554@fcm.unc.edu.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gracias Rubén, Jaime y Alvaro por responder...

On Tue, 18 Apr 2006 23:36:58 -0500, Jaime Casanova wrote
> esta funcion no deberia ser declarada IMMUTABLE, porque accesa a la
> base de datos, algo que no debe hacer *ninguna* funcion que sea
> IMMUTABLE... (no tiene nada que ver con tu duda, por eso no voy a
> hacer mucho comentario sobre eso ;)

Es cierto que no es mi duda, no obstante creo que no hay ningún problema en
ser declarada como IMMUTABLE ya que solamente accede para hacer un SELECT, no
para modificar datos. Al hacer solamente consulta, entiendo que es mas
eficiente según lo indica en:

http://www.postgresql.org/docs/8.1/static/xfunc-volatility.html

Ahora... otra cosa que puede pasar es que yo con mi inglés que deja bastante
que desear, haya entendido cualquier cosa ;).

> > postgres$# IF NOT FOUND THEN
> > postgres$# RETURN valor;
> > postgres$# END IF;
> >
> > Aquí debería devolverme el valor 33 o yo estoy haciendo muy mal?.
>
> No, porque estas haciendo "SELECT INTO valor id" al hacer eso cuando
> no regreso ninguna fila le asigno NULL valor...

Es cierto... hice ese ejemplo para "simplificarlo" y no fué bueno. En realidad
lo que necesito es que si no encuentra, haga una nueva consulta en una nueva
tabla. La función original es la siguiente:

CREATE OR REPLACE FUNCTION "selectCupoActividadPerfil"(integer,integer)
RETURNS int4 AS $$
DECLARE
cupoGral INTEGER;
cupoPart INTEGER;
BEGIN
SELECT INTO cupoGral cupo FROM actividad WHERE id = $1;
IF NOT FOUND THEN
SELECT INTO cupoPart cupo FROM "cupoActividadPerfil" WHERE actividad_id =
$1 AND perfil_id = $2;
RETURN cupoPart;
END IF;
RETURN cupoGral;
END;
$$ LANGUAGE plpgsql IMMUTABLE SECURITY DEFINER;

La ejecuto en psql:

text=# SELECT * FROM "selectCupoActividadPerfil"(4,7);
selectCupoActividadPerfil
---------------------------

(1 row)

test=# SELECT cupo FROM "cupoActividadPerfil" WHERE actividad_id = 4 AND
perfil_id = 7;
cupo
------
0
(1 row)

Osea, yo espero que la función me devuelva cero, no nulo. Perdón si lo estoy
haciendo muy largo. Un gran saludo a todos...
-
-------------------------------------------
Sebastián Villalba
sebastian(at)fcm(dot)unc(dot)edu(dot)ar
-------------------------------------------

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Zulima 2006-04-19 14:32:19 Re: Formato Fecha
Previous Message WILLIAM PARRA 2006-04-19 14:02:07 Re: Es posible un Link entre Oracle y Postgresql?