Re: Problema con commits y rollbacks

From: "Juan Romero" <jgromero(at)gmail(dot)com>
To: "LEONARDO GARCIA" <garcialmx(at)pdvsa(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Problema con commits y rollbacks
Date: 2007-05-02 13:30:38
Message-ID: 3c7410400705020630m6a6e70a0yc6a551569e9044f2@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On 4/27/07, LEONARDO GARCIA <garcialmx(at)pdvsa(dot)com> wrote:
>
>
> Hola a todos y Buenas Tardes.

Buen día,

Actualmente estoy investigando sobre los commits en funciones de postgres y
> he encontrado algunos problemas, me gustaría contar con alguna manera de
> realizar commit dentro de funciones plpgsql pero no lo he logrado, según he
> leido en los archivos de la lista ésto no es posible.
>
> Me gustaría saber si alguno me puede dar una sugerencia para abordar este
> problema, tengo una función que realiza el llenado de una tabla y requiero
> que el mismo si es interrunpido por alguna causa sea guardado en la tabla
> hasta donde pudo llegar sin hacer rollback de la transacción.
>
> He estado probando algunas variaciones del siguiente script:
>
>
> CREATE TABLE prueba
> (
> numero numeric(10) NOT NULL DEFAULT 0,
> "Descripcion" varchar(40),
> CONSTRAINT prueba_pk PRIMARY KEY (numero)
> )
> WITHOUT OIDS;
>
> CREATE OR REPLACE FUNCTION llena_prueba(comienza bool)
> RETURNS text AS
> $BODY$
> DECLARE
> ultimo numeric;
> BEGIN
> ultimo=0;
> SET search_path = public, pg_catalog;
> SELECT COALESCE(MAX(prueba.numero),1) INTO ultimo from prueba;
> FOR i IN ultimo..10000000 LOOP
> BEGIN
> INSERT INTO prueba values(i,'PRUEBA '||i);
> EXCEPTION WHEN others THEN
> -- NADA
> RETURN 'termino';
> END;
> IF MOD(i,100)=0 THEN
> RAISE NOTICE 'INSERTADOS %',i;
> END IF;
> END LOOP;
> END;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE;
>
>
> Luego invoco la función con:
>
> select llena_prueba(true);
>
> Esta función está programada para conseguir el último valor insertado en
> la tabla y continuar con el próximo hasta llegar a 10 millones de filas.
> El problema es que si cancelo la ejecución del script luego de haber
> insertado unos cientos de filas, se realiza automáticamente el rollback y no
> se conservan las filas ya insertadas,
> ¿Sabe alguno de Uds. como podría lograr conservar los cambios aunque se
> cancele la ejecución?
> Agradezco cualquier sugerencia.

Creo que en este caso, los savepoints te deberán servir:

http://www.postgresql.org/docs/8.2/static/sql-savepoint.html

Agradeciendo de antemano su excelente ayuda se despide.
>
> Atte.
>
> Leonardo García.
> Los Teques-Venezuela.

Saludos,

Juan Romero

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2007-05-02 14:01:11 Re: Problema con commits y rollbacks
Previous Message Patricia Lopez Ravenau 2007-05-02 12:52:09 Re: mapa de base de datos