He estado intentando con el savepoint pero no lo he conseguido hacer
funcionar lo que tengo es algo así
un cursor y anidado otro cursor, dentro de las instrucciones del cursor
interno se hacen updates o inserts y quiero que esos no se han
transaccionales. Utilizo el savapoint y caputuro la exception
pero siempre se va por la excepcion y no sale nunca del cursor.
El código que tengo hace mas o menos algo así:
CREATE OR REPLACE FUNCTION calculo()
RETURNS text AS
$BODY$
DECLARE
cursor_a RECORD;
cursor_b RECORD;
BEGIN
FOR cursor_a IN SELECT a,b,c from tabla_a
LOOP
FOR cursor_b IN SELECT select d,e,r from tabla_b
LOOP
BEGIN
IF(cursor_a.a=cursor_b.d)
THEN
BEGIN
--- calculos, procesamiento y updates
SAVEPOINT my_savepoint;
-- capturo la exception pero siempre se genera y nunca sale del cursor
END;
END IF;
END LOOP;
END LOOP;
return 'Finalizado';
END;
$BODY$
LANGUAGE plpgsql VOLATILE STRICT;
ALTER FUNCTION calculo()
OWNER TO postgres;
Gracias, Nuevamente.
Att
Jorge García.
2012/9/19 Jaime Casanova <[email protected]>
> 2012/9/19 Jorge Garcia <[email protected]>:
> >
> > Tengo una función que realiza cálculos a unos 80 mil registros los
> registros
> > los recorro en un cursor y se hace calculo registro por registro y quiero
> > que no se haga commit al final de todo el procesamiento si no que se haga
> > commit por cada registro procesado y saber si se proceso o hubo algún
> error.
> > como puedo hacer eso?? de antemano gracias por la ayuda que me puedan
> dar.
> >
>
> Saludos,
>
> Estamos hablando de una función almacenada aquí? Si es así, toda la
> función ocurre dentro de la misma transacción que invoco a la función,
> si no había una transacción abierta la función abre una transacción
> automáticamente al iniciar y la cierra con COMMIT al terminar o con
> ROLLBACK si algún error ocurrió.
>
> Si no quieres que no poder procesar un registro termine todo lo
> avanzado puedes usar SAVEPOINT para atrapar el error y evitar que la
> función termine.
>
> --
> Jaime Casanova www.2ndQuadrant.com
> Professional PostgreSQL: Soporte 24x7 y capacitación
>