Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

manejo de errores en pl/pgsql

Estas en el tema de manejo de errores en pl/pgsql en el foro de PostgreSQL en Foros del Web. buenas a todos tengo un store procedure y en el estoy borrando un campo de muchas tablas. pero no todas las tablas tienen este campo, ...
  #1 (permalink)  
Antiguo 23/09/2010, 18:06
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
manejo de errores en pl/pgsql

buenas a todos

tengo un store procedure y en el estoy borrando un campo de muchas tablas. pero no todas las tablas tienen este campo, por lo tanto me genera error.

necesito atrapar este error de tal modo que me permita seguir con el resto de las tablas hasta que acabe.

Lastimosamente no entendi mucho la documentacion :(

ESTO ES LO QUE TENGO

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION p_shops_subtables_geoindex(CHARACTER VARYING)
  2.   RETURNS VOID AS
  3. $BODY$
  4. DECLARE
  5.     rec     RECORD;
  6.     shop_table  ALIAS FOR $1;
  7. BEGIN
  8.     FOR rec IN EXECUTE 'SELECT DISTINCT codigo_categoria FROM '||shop_table LOOP
  9.         EXECUTE 'ALTER TABLE '||shop_table||'_'||rec.codigo_categoria||' DROP COLUMN geom';
  10.  
  11.         EXCEPTION WHEN undefined_column THEN
  12.             -- do nothing
  13.         END;
  14.        
  15.         EXECUTE 'SELECT AddGeometryColumn ('||QUOTE_LITERAL(shop_table||'_'||rec.codigo_categoria)||','||QUOTE_LITERAL('geom')||',4326,'||QUOTE_LITERAL('POINT')||',2)';
  16.         EXECUTE 'UPDATE '||shop_table||'_'||rec.codigo_categoria||' set geom = GeometryFromText(''POINT(''||CX||'' ''||CY||'')'',4326)';
  17.         EXECUTE 'CREATE INDEX idx_info2009_'||rec.codigo_categoria||' ON '||shop_table||'_'||rec.codigo_categoria||' USING GIST (geom)';
  18.     END LOOP;
  19.     RETURN;
  20. END;
  21. $BODY$
  22.   LANGUAGE 'plpgsql' VOLATILE;

Última edición por webness; 23/09/2010 a las 18:18
  #2 (permalink)  
Antiguo 24/09/2010, 08:43
Avatar de 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
  #3 (permalink)  
Antiguo 24/09/2010, 11:08
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: manejo de errores en pl/pgsql

No sabia que se podian meter bloques de begin dentro del bloque especifico de begin de la funcion, que gran aoporte gracias
  #4 (permalink)  
Antiguo 24/09/2010, 12:15
Avatar de 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

La verdad yo tampoco sabía Sabía que en Oracle se podía hacer y supuse que postgresql no se podía quedar atras en este tema.
En estos momentos (unas horas después) ya le estoy dando uso para detección de errores en unos procedimientos que trabajo.

saludos webness
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 24/09/2010 a las 12:22
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 22:22.