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.