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

MUchas gracias por la informacion, la duda era de como implementar las transacciones dentro de procedimiento, ya lo pude hacer, solo basto con agregar unos manejador para ROLLBACK y listo, todo va al 100. Dejo el codigo para que lo vean.

Saludos
DELIMITER //
CREATE PROCEDURE clonar_materia(id_materia_clonar INT)

BEGIN
DECLARE done INT DEFAULT 0;
-- variables de para los cursores.
DECLARE ...;

DECLARE cursor2 CURSOR FOR SELECT * FROM tarea2_tmp;
DECLARE cursor3 CURSOR FOR SELECT * FROM tabla_relacionada_tmp;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;

DROP TABLE IF EXISTS tabla2_tmp;
CREATE TEMPORARY TABLE tabla2_tmp ...;

DROP TABLE IF EXISTS tabla_relacionada_tmp;
CREATE TEMPORARY TABLE tabla_relacionada_tmp...

SET autocommit = 0;
START TRANSACTION;

INSERT INTO tabla SELECT ... WHERE id_=id_materia_clonar;
SELECT MAX(id_materia) FROM tabla INTO nuevo_id_materia;

OPEN cursor2;
REPEAT
FETCH cursor2 INTO ... ;
IF NOT done THEN
INSERT INTO tabla2 ...;
UNTIL done END REPEAT;
SET done=0;
CLOSE cursor2;

OPEN cursor3;
REPEAT
FETCH cursor3 INTO ...;
IF NOT done THEN
INSERT INTO tabla_relacionada VALUES ...
SET SQL_SAFE_UPDATES=0;
UPDATE tabla_relacionada SET ...
END IF;
UNTIL done END REPEAT;
SET done=0;
CLOSE cursor3;
COMMIT;

END
//
DELIMITER ;