Que tal webness.
Lo que se me ocurre es que metas las operaciones que posiblemente generan error en bloques separados dentro de la función, con el fin de que un error no te tumbe el desarrollo de la misma.
Te pongo un ejemplo de lo que te digo y ya tu lo acomodas a tus necesidades.
Código SQL:
Ver originalCREATE OR REPLACE FUNCTION prueba_exception(text)
RETURNS text AS
$BODY$
DECLARE
mensaje TEXT;
BEGIN
mensaje := 'Bloque de afuera, sin errores ';
BEGIN
EXECUTE 'INSERT INTO ' || $1 || ' VALUES(9)';
mensaje := mensaje || ' ******** El bloque de adentro, también sin errores';
EXCEPTION WHEN OTHERS THEN
mensaje := mensaje || ' ******** El bloque de adentro, con errores';
END;
RETURN mensaje;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Fijate que hay dos bloques internos dentro de la función.
Al interior hay un execute que si le pongo una tabla invalida, me generará error. Pero si le pongo una tabla valida, se ejecutará correctamente. Fijate que si no me salta a la exception, el mensaje que concatena es que no hay errores. Si me salta a la exception el mensaje que se concatena que hay errores.
Mayusculas es una tabla que existe en mi base de datos
Código SQL:
Ver originalpruebas=> SELECT prueba_exception('mayusculas');
prueba_exception
-----------------------------------------------------------------------------------
Bloque de afuera, sin errores ******** El bloque de adentro, tambiÚn sin errores
(1 fila)
pruebas=> SELECT prueba_exception('tabla_que_no_existe');
prueba_exception
---------------------------------------------------------------------------
Bloque de afuera, sin errores ******** El bloque de adentro, con errores
(1 fila)
Ya con esto, puedes meter en un bloque interno las operaciones que tienden a fallar, ya sea para ignorarlas o tratarlas.
espero te sirva de ayuda