Hola,
 
Necesito abrir una transacción y hacer un commit antes de salir de la
función. 
Ya estube buceando en la documentación, pero he intentado varias formas y no
he podido.
 
El problema es el siguiente: 
Tengo un función que usa tablas temporales y necesito llamar la función
varias veces desde una misma sesión.
Para solucionar esto utilice la sintaxis CREATE TABLE XXX(X     INTEGER) ON
COMMIT DROP; lo que me asegura que en el primer commit que haga se destruye
la tabla.
Para probarlo ejecute esta secuencia varias veces desde una misma sesión:
 
begin;
create temporary table ya(x  integer) ON COMMIT DROP;
INSERT INTO ya values(1);
select * from ya;
commit;
 
y en ningún momento me dio problemas.......
 
Los problemas los empece a experimentar cuando lo metí en una función:
 
CREATE OR REPLACE FUNCTION "public"."funcion_prueba" () RETURNS SETOF
"pg_catalog"."record" AS'
BEGIN
    CREATE TEMPORARY TABLE ya( x integer ) ON COMMIT DROP;
   
    INSERT INTO ya values (1);
 
    --RETORNA LOS RESULTADOS
    FOR resultado IN SELECT x  FROM ya LOOP
        RETURN NEXT resultado;
    END LOOP;
    RETURN;
END;
'LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY DEFINER;
 
Asi como esta si lo ejecuto 2 veces no me sirve porque la tabla temporal
existe.
 
Entoneces al final le puse un COMMIT; pero si lo ejecuto dos veces seguidas
parece que no puede crear la tabla temporal y cuando la va ha usar dice que
no existe la realación OID y algún número... supongo que no da el nombre
porque ya no existe y busca una referencia vieja o algo así.
 
creo que la solución es abrir una transacción y cerrarla dentro de la
función como el script que probé de primero, pero a la hora de poner en la
función el begin asi:
 
CREATE OR REPLACE FUNCTION "public"."funcion_prueba" () RETURNS SETOF
"pg_catalog"."record" AS'
BEGIN
    BEGIN;
    CREATE TEMPORARY TABLE ya( x integer ) ON COMMIT DROP; 
 
... me da problemas , tambien traté con START pero igual me falla.
 
Si alguien me puede ayudar se los agradecería mucho... .
 
Saludos,
Gerardo.