Problema con funciones y transacciones y tablas temporales

From: Gerardo Castillo <gcastillo(at)ice(dot)co(dot)cr>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Problema con funciones y transacciones y tablas temporales
Date: 2004-07-21 22:15:12
Message-ID: 0I1800FEG2ZBYN@ice.co.cr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mario Soto 2004-07-21 22:39:31 Re: hola tengo el siguiente error
Previous Message JimAlexandr 2004-07-21 22:04:47 // TEST - a lista pgsql-es-ayuda //