Re: Problema con commits y rollbacks

From: Julio Cesar Sánchez González <knowhow(at)sistemasyconectividad(dot)com(dot)mx>
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-04-28 05:29:03
Message-ID: 1177738144.6742.5.camel@scoserver
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El vie, 27-04-2007 a las 15:29 -0400, LEONARDO GARCIA escribió:
>
> Hola a todos y Buenas Tardes.
>
> 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.

Si tienes razon, 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:
>
>

Se me ocurre que puedes llamar a la funcion dentro de una transaccion
como si se tratara de alguna funcion incorporada de postgresql, aunque
no me creas mucho porque no lo he probado pero en teoria debe de
funcionar.

> 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.
>
> Agradeciendo de antemano su excelente ayuda se despide.
>
> Atte.
>
> Leonardo García.
> Los Teques-Venezuela.
> *************** PDVSA´S INTERNET E-MAIL USE ***************
> This message may contain information solely of the interest of PDVSA
> or
> its businesses. Copying, distribution, disclosure or any use of the
> information contained in this transmission is permitted only to
> authorized parties. If you have received this e-mail by error, please
> destroy it and notify webmaster(at)pdvsa(dot)com or the sender by reply
> email.
>
> ****** USO DEL CORREO ELECTRONICO DE PDVSA HACIA INTERNET ******
> Esta nota puede contener informacion de interes solo para PDVSA o sus
> negocios. Solo esta permitida su copia, distribucion o uso a personas
> autorizadas. Si recibio esta nota por error, por favor destruyala y
> notifique al remitente o a webmaster(at)pdvsa(dot)com(dot)
>
--
Atentamente

Julio Cesar Sánchez González.

Ahora me he convertido en la muerte, destructora de mundos.
Soy la Muerte que se lleva todo, la fuente de las cosas que vendran.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message pablo 2007-04-28 05:53:17 administrador para linux
Previous Message Herberth Lagos 2007-04-28 05:05:34 Re: [pgsql-es-ayuda] Sistema de Fotografías