Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-05-2013
elrodrix elrodrix is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 32
Poder: 0
elrodrix Va por buen camino
Transaccion en Procedimiento Almacenado

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

Código 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
Responder Con Cita
  #2  
Antiguo 08-05-2013
elrodrix elrodrix is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 32
Poder: 0
elrodrix Va por buen camino
Investigando encontre una forma de arreglar un poco mi SP

Código 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

    /*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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Procedimiento almacenado Rodrigo_I Oracle 3 11-06-2012 17:59:53
procedimiento almacenado kejos MS SQL Server 3 02-09-2008 17:39:22
Transacción y procedimiento almacenado... peccatum Conexión con bases de datos 3 05-11-2007 15:54:50
Procedimiento Almacenado rodrigo19 Oracle 5 22-08-2007 22:55:40
confirmar transaccion en un procedimiento almacenado karocs SQL 3 09-08-2004 18:49:24


La franja horaria es GMT +2. Ahora son las 09:10:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi