Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/10/2012, 11:30
alejandrolll
 
Fecha de Ingreso: octubre-2012
Mensajes: 3
Antigüedad: 11 años, 6 meses
Puntos: 0
Transacciones en procedimientos almacenados

Hola a todos, espero me puedan orientar con mi problema.

Tengo un procedimiento almacenado que duplica un registro dado un id, y se duplica en todas las tablas donde aparezca ese id, y en las tablas con las que esta relacionado.

Para esto tengo varios cursores que duplican el registros el las diferentes tablas, y ahora ahorita lo hace bien, el problema comienza cuando ocurre algún error en la inserción en alguno de los cursores, es decir, si ya había ejecutado 2 correctamente, y en el tercero se provoca el error, la ejecución se detiene, pero lo que se inserto en los dos primeros cursores, ya no se deshace, y quiero que se ejecuten todos los cursores o no se ejecute ninguno si es que ocurre algún error.
MI código esta así actualmente, lo pongo incompleto ya que lo importante es lo delas transacciones.

Código MySQL:
Ver original
  1. DELIMITER //
  2. CREATE PROCEDURE clonar_materia(id_materia_clonar INT)
  3.  
  4. -- variables de para los cursores.
  5. DECLARE ...;
  6.  
  7. DECLARE cursor2 CURSOR FOR SELECT * FROM tarea2_tmp;
  8. DECLARE cursor3 CURSOR FOR SELECT * FROM tabla_relacionada_tmp;
  9.  
  10. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  11.  
  12. DROP TABLE IF EXISTS tabla2_tmp;
  13. CREATE TEMPORARY TABLE tabla2_tmp ...;
  14.  
  15. DROP TABLE IF EXISTS tabla_relacionada_tmp;
  16. CREATE TEMPORARY TABLE tabla_relacionada_tmp...
  17.  
  18. INSERT INTO tabla SELECT ... WHERE id_=id_materia_clonar;
  19. SELECT MAX(id_materia) from tabla INTO nuevo_id_materia;
  20.  
  21. OPEN cursor2;
  22.    FETCH cursor2 INTO ... ;
  23.     IF NOT done THEN
  24.             INSERT INTO tabla2 ...;
  25.   UNTIL done END REPEAT;
  26. SET done=0;
  27. CLOSE cursor2;
  28.  
  29. OPEN cursor3;
  30.       FETCH cursor3 INTO ...;
  31.          IF NOT done THEN
  32.              INSERT INTO tabla_relacionada VALUES ...
  33.              SET SQL_SAFE_UPDATES=0;
  34.              UPDATE tabla_relacionada SET ...
  35.          END IF;
  36.  UNTIL done END REPEAT;
  37.  SET done=0;
  38. CLOSE cursor3;
  39.  
  40. //
  41. DELIMITER ;

Última edición por gnzsoloyo; 26/10/2012 a las 12:30 Razón: Codigo sin etiquetar.