Ir al contenido


Foto

Transaccion en Procedimiento Almacenado


  • Por favor identifícate para responder
1 respuesta en este tema

#1 elrodrix

elrodrix

    Member

  • Miembros
  • PipPip
  • 24 mensajes

Escrito 07 mayo 2013 - 03:15

Que tal? Tengo un procedimiento almacenado donde realizo 3 INSERT IMPORTANTES en un solo SP, a traves de una aplicacion en DELPHI utilizando componentes ADO. Queria saber como puedo hacer para que, en caso de realizarce los 3 INSERT CORRECTAMENTES, mysql me envie un msj de EXITO por ej, y lo pueda interceptar en delphi para tirar un mensaje en la aplicacion de EXITO. Y en el caso de algun error (como caida del servidor por ej) que NO me realice ningun INSERT y deshaga todas las operaciones realizadas, y obviamente me envie un msj de ERROR a mi aplicacion asi poder mostrar en DELPHI al usuario que ha ocurrido un error. Lei acerca de transacciones, pero no se bien donde incluirlas en mi codigo. Les dejo mi Codigo SQL

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `acta_alta`(
    in p_actanum int,
    in p_actaserie varchar(2),
    in p_actafecha Date,
    in p_actahora varchar (5),
    in p_offdni int,
    in p_empresaid int,
    in var1 int,
    in var2 int,
    in var3 int,
    in var4 int,
    in var5 int,
    in var6 int,
    in var7 int,
    in var8 int,
    in var9 int,
    in var10 int,
    in p_vehicledom varchar (45),
    in p_lugarid int,
    in p_actanumcalle varchar (45),
    in p_causanum int,
    in p_causafecha date,
    in p_usu int
   
)
BEGIN

/*Primer INSERT datos ACTA*/

    INSERT INTO acta (actanum, actaserie, actafecha, actahora, actanumcalle, offdni, empresa_id, vehicledom, lugar_id, causanum, causafecha)
    VALUES (p_actanum, p_actaserie, p_actafecha, p_actahora, p_actanumcalle, p_offdni, p_empresaid, p_vehicledom, p_lugarid, p_causanum, p_causafecha);

/*Segundo INSERT datos INFRACCION*/

    if var1 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var1);
    end if;
   
    if var2 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var2);
    end if;
   
    if var3 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var3);
    end if;
   
    if var4 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var4);
    end if;
   
    if var5 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var5);
    end if;
   
    if var6 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var6);
    end if;
   
    if var7 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var7);
    end if;
   
    if var8 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var8);
    end if;
   
    if var9 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var9);
    end if;
   
    if var10 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var10);
    end if;
   
/*Tercer INSERT de CAUSA en tabla CAUSA*/

    INSERT INTO causa (causanum, causafecha)
    VALUES (p_causanum, p_causafecha);
   
/*cuarto INSERT para AUDITORIA ACTA*/

    INSERT INTO audit_acta (tipoact, actanum_new, actaserie_new, actafecha_new, actahora_new, usu_id, fecha, hora)
    VALUES ('I', p_actanum, p_actaserie, p_actafecha, p_actahora, p_usu, CURRENT_DATE(), CURRENT_TIME());

END


Muchas gracias y saludos
  • 0

#2 elrodrix

elrodrix

    Member

  • Miembros
  • PipPip
  • 24 mensajes

Escrito 07 mayo 2013 - 09:13

Investigando encontre una forma de arreglar un poco mi SP

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `acta_alta`(
    in p_actanum int,
    in p_actaserie varchar(2),
    in p_actafecha Date,
    in p_actahora varchar (5),
    in p_offdni int,
    in p_empresaid int,
    in var1 int,
    in var2 int,
    in var3 int,
    in var4 int,
    in var5 int,
    in var6 int,
    in var7 int,
    in var8 int,
    in var9 int,
    in var10 int,
    in p_vehicledom varchar (45),
    in p_lugarid int,
    in p_actanumcalle varchar (45),
    in p_causanum int,
    in p_causafecha date,
    in p_usu int
   
)
BEGIN

    /*Handler para error SQL*/
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
            SELECT 1 as error;
            ROLLBACK;
        END;
   
    /*Handler para error SQL*/   
    DECLARE EXIT HANDLER FOR SQLWARNING
        BEGIN
            SELECT 1 as error;
            ROLLBACK;
        END;

/*Inicia transaccion*/
START TRANSACTION;

/*Primer INSERT datos ACTA*/
    INSERT INTO acta (actanum, actaserie, actafecha, actahora, actanumcalle, offdni, empresa_id, vehicledom, lugar_id, causanum, causafecha)
    VALUES (p_actanum, p_actaserie, p_actafecha, p_actahora, p_actanumcalle, p_offdni, p_empresaid, p_vehicledom, p_lugarid, p_causanum, p_causafecha);

/*Segundo INSERT datos INFRACCION*/

    if var1 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var1);
    end if;
   
    if var2 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var2);
    end if;
   
    if var3 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var3);
    end if;
   
    if var4 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var4);
    end if;
   
    if var5 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var5);
    end if;
   
    if var6 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var6);
    end if;
   
    if var7 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var7);
    end if;
   
    if var8 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var8);
    end if;
   
    if var9 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var9);
    end if;
   
    if var10 >0 then
        INSERT INTO actabreach (actanum, actaserie, breach_id)
        VALUES (p_actanum, p_actaserie, var10);
    end if;
   
/*Tercer INSERT de CAUSA en tabla CAUSA*/

    INSERT INTO causa (causanum, causafecha)
    VALUES (p_causanum, p_causafecha);
   
/*cuarto INSERT para AUDITORIA ACTA*/

    INSERT INTO audit_acta (tipoact, actanum_new, actaserie_new, actafecha_new, actahora_new, usu_id, fecha, hora)
    VALUES ('I', p_actanum, p_actaserie, p_actafecha, p_actahora, p_usu, CURRENT_DATE(), CURRENT_TIME());

/*Fin de transaccion*/
COMMIT;


/*Mandamos 0 si todo salio bien*/
SELECT 0 as error;

END




En delphi capturo el numero del error (0,1) en una variable, y pregunto si esa variable es igual a 0, entonces se realizo correctamente los INSERT, de lo contrario, ocurrio un error.

Saludos y espero que les sirva tambien.
  • 0