Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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.
 

pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group