On Tue, 13 Mar 2012 23:18:08 +0100
Jo Mateix <2uol...@gmail.com> wrote:

> Creo esta función en esquema public :
> 
> CREATE OR REPLACE FUNCTION zz()
>   RETURNS text AS
> $BODY$
> DECLARE
> declare resultado varchar(35);
> BEGIN
> 
> select titulo into resultado
> from empresas;
> 
> return resultado;
> END;
> $BODY$
>   LANGUAGE plpgsql VOLATILE
>   COST 100;
> ALTER FUNCTION zz()
>   OWNER TO postgres;
> 
> set search_path=esquema1,public;
> select * from empresas;                        -- Me devuelve
> correctamente el nombre de la empresa en esquema1
> select zz();                                          -- Me devuelve
> correctamente el nombre de la empresa en esquema1
> 
> set search_path=esquema2,public;
> select * from empresas;                      -- Me devuelve
> correctamente el nombre de la empresa en esquema2
> select zz();                                  *Sigue devolviendo el
> nombre de esquema1, porque?*
> Por mucho que cambie el esquema con search_path, si no cierro la
> sesión, la función zz() siempre se ejecuta en el esquema1.
> Si cierro la sesión y la función se ejecuta primero en esquema2
> devuelve el resultado de este pero ya es imposible ejecutarla y que
> devuelva el resultado del esquema1.
> 
> Es posible forzarle el esquema sobre el cual debe actuar? o bien
> limpiar la memoria que se queda de la primera ejecución sin necesidad
> de cerrar la sesión?
> 

Cambia:
select titulo into resultado from empressas 

Por: 
EXECUTE SELECT titulo FROM empresas INTO resultado

Esto va a hacer que plpgsql no guarde el plan que usa para la consulta
y por lo tanto no tenga nada para reutilizar

Espero que te sirva y que este correcto porque no tuve tiempo de
probarlo....

Saludos

Rodrigo
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a