Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/09/2010, 08:43
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: manejo de errores en pl/pgsql

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 original
  1. CREATE OR REPLACE FUNCTION prueba_exception(text)
  2.   RETURNS text AS
  3. $BODY$
  4. DECLARE
  5. mensaje TEXT;
  6. BEGIN
  7. mensaje := 'Bloque de afuera, sin errores ';
  8.     BEGIN
  9.         EXECUTE 'INSERT INTO ' || $1 || ' VALUES(9)';
  10.         mensaje := mensaje || ' ******** El bloque de adentro, también sin errores';
  11.     EXCEPTION WHEN OTHERS THEN
  12.         mensaje := mensaje || ' ******** El bloque de adentro, con errores';
  13.     END;
  14. RETURN mensaje;
  15. END;
  16. $BODY$
  17. 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 original
  1. pruebas=> SELECT prueba_exception('mayusculas');
  2.                                  prueba_exception
  3. -----------------------------------------------------------------------------------
  4.  Bloque de afuera, sin errores  ******** El bloque de adentro, tambiÚn sin errores
  5. (1 fila)
  6.  
  7. pruebas=> SELECT prueba_exception('tabla_que_no_existe');
  8.                              prueba_exception
  9. ---------------------------------------------------------------------------
  10.  Bloque de afuera, sin errores  ******** El bloque de adentro, con errores
  11. (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
__________________
Without data, You are another person with an opinion.
W. Edwads Deming