Ver Mensaje Individual
  #5 (permalink)  
Antiguo 13/05/2013, 10:22
max_mouse699
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Respuesta: Dudas creación de procedimiento

@yosoloyo: los pasos que te indique estan correctos, solo que de acuerdo a la escritura de tu procedimiento, esribiste mal lo que te indique:

- en BEGIN, deberias haber escritor BEGIN(); porque es una funcion.
- en donde pusiste COMMIT, el mismo caso.
- en donde dice START TRANSACTION esta demas eso.
- creo que te confundiste con la declaracion de BEGIN ... END que se realiza para el cierre de un SP, te dejo como deberia estar esrito:

Código MySQL:
Ver original
  1. CREATE PROCEDURE nombreproc(IN idprod INT, IN precioprod FLOAT, IN idcli INT)
  2.   BEGIN();
  3.    UPDATE tabla1 SET aaa = aaa, bbb = bbb   WHERE idc = idcli;
  4.    INSERT INTO tabla2 (campo1, campo2, campo3) VALUES (NULL, aaa, bbb);
  5.    DELETE FROM tabla3 WHERE ccc=idprod;
  6.    UPDATE tabla4 SET ddd = ddd WHERE ddd=ddd;
  7.  
  8.  COMMIT();

pruebalo ahora y te resultara.

Ahora voy a realizar una aclaracion. Lo quete menciona gnzsoloyo, en parte es correcto, porque no existe lo que tu qieres realizar que se ejecuten todas a la vez, solo se iran ejecutando en el orden especificado por ti a la hora de programar el SP o las transacciones que vayas incluyendo, pero lo que yo te indique que hicieras cumple con lo que requieres, paso a explicar el funcionamiento de lo que mencione.

Cuando tu inicias una transaccion con BEGIN(); y tiene todas esas sentencias sql que ingresan, modifican o eliminan datos, hasta que tu no le des la instruccion de COMMIT(); estas consultas jamas se ejecutaran realmente en tus bases de datos, sino que solo se ejecutaran en las tablas virtuales que crea MySQL para tales efectos. Si en algun caso una instruccion ha lanzado algun error ya sea porque uno de los campos que declaraste no se encuentra en la base de datos, lo que realiza MySQL es una llamada a la funcion ROLLBACK(), que lo que hace es deshacer todo lo realizado, y no lo hace efectivo en tus bases de datos. De forma contraria, si todas las instrucciones se han ejecutado de forma correcta, y se encuentra la funcion COMMIT(); todos los cambios los realiza ahora de forma fisica en tus bases de datos y lo refleja para ti exitosamente.

Recuerda, las consultas se ejecutaran en orden.

Cita:
Claro que tiene como restricción que las tablas usadas, en el caso de MySQL, deben ser sí o sí InnoDB, y no pueden ser MyISAM.
Esto es totalmente correcto, para realizar lo que te mencione, todas las tablas asociadas deben ser InnoDB.

Cita:
las sentencias DML en MySQL son de ejecución inmediata,
Esto se cumple gracias al trabajo de los desarrolladores, quienes implementaron el AutoCommit, y el AutoBegin en los motores de base de datos, que nos permite poder escribir cualquier sentencia de forma que sea sencilla y como la conocemos todos en la actualidad, porque si no fuera asi, todos deberiamos escribir:

BEGIN();
query;
COMMIT();