Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Parametros + Stored Procedure (https://www.clubdelphi.com/foros/showthread.php?t=68393)

betto 11-06-2010 00:20:01

Parametros + Stored Procedure
 
Hola a todos:

Mi problema es el siguiente, estaba usando delphi 7 para el desarrollo de una aplicacion y tenia un componente que me permitia ejecutar TRANSACCIONES para asegurar que se ejecutaran todas mis instrucciones o ninguna (zeos). Despues migre el codigo del sistema a delphi 2010 y ahi no tengo ese componente.
Intente utilizar un componente que ejecuta Querys simples, pasando como parametro la siguiente instruccion:

START TRANSACTION WITH CONSISTENT SNAPSHOT;
UPDATE tablaX SET ENTREGA = 0 WHERE ciudad='MEX' AND ID= 253 AND TIPO=1;
UPDATE tablaX SET ENTREGA = 0 WHERE ciudad='MEX' AND ID= 253 AND TIPO=2;
UPDATE tablaX SET ENTREGA = 0 WHERE ciudad='MEX' AND ID= 253 AND TIPO=3;
UPDATE tablaY SET ENTREGA = 0 WHERE ciudad='MEX' AND ID= 253 AND ID_PAGO=5;
DELETE FROM tablaX WHERE SISTEMA = 0 AND ENTREGA = 0 AND ID =253 AND ciudad= 'MEX';
COMMIT;


pero me marca error en el componente TSQLQuery. :mad:

La pregunta es: alguien puede orientarme en como pasar mis Querys como parametro a un Stored Procedure y ejecutarlos desde el server?
intente pasar como parametro la cadena con los querys pero no reconoce como instruccion el parametro, es algo mas o menoa asi:

CREATE PROCEDURE `XYZ`(IN _SQL VARCHAR(2000) )
BEGIN
START TRANSACTION WITH CONSISTENT SNAPSHOT;
_SQL;
COMMIT;
END

pero no obtengo ningun resultado. no me deja guardar por que no reconoce _SQL como instruccion.

Otra cosa que he intentado es insertar las instrucciones en una tabla para poder tomarlas desde el stored procedure pero tampoco me ha dado resultado.


Datos Extra:
Admin de BD: MySQL 5.0
Lenguaje: Delphi 2010
Componente utilizado Actualmente: TSQLQuery de DBExpress


Espero que alguien puedo ayudarme.

Saludos y de antemano gracias.:)

osmuar_exp 11-06-2010 22:02:09

Procedimiento Almacenado
 
Hola, con este procedimiento que debes de crear te modifica la tabla, solamente que debes de mandarle los parametros...

1) Procedimiento Almacenado
Código SQL [-]
CREATE PROCEDURE Actualizar (ENTREGA INTEGER(11), CIUDAD CHAR(50), ID INTEGER(11), TIPO integer(11) )
    NOT DETERMINISTIC
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    SET @s = CONCAT('update tablaX set entrega =' , ENTREGA , ' where ciudad = ', CIUDAD, ', id = ' , ID, ', tipo = ' , TIPO);
    PREPARE consulta FROM @s;
    EXECUTE consulta;
  END;


2) Consulta para mandarle los parámetros al procedimiento
Código Delphi [-]
procedure Actualizar(entrega:integer; ciudad:string; id:integer; tipo:integer);
 var xConsulta:TADOQuery;
 begin 
    xConsulta:=TADOQuery.Create(nil);
    xConsulta.Connection:=frm_md.conexion;
    try
      with xConsulta do
       begin
           close;
           sql.Text:='call Actualizar('+IntToStr(entrega)+','+QuotedStr(ciudad)+','+inttostr(id)+','+IntToStr(tipo)+')';
           ExecSQL;
       end;
    finally
      xConsulta.free;
  end;
 end;
3) Y para mandarlo en delphi seria algo asi:
Código Delphi [-]
Actualizar(0,'MEX',253,1);

Saludos

betto 12-06-2010 00:23:12

Hola, de antemano muchisimas gracias por la respuesta, me funciona cuando es una sola instruccion ya que tengo este codigo:

CREATE PROCEDURE `X_Y_Z`(IN _SQL text)
BEGIN
SET @s = _SQL;
PREPARE INSERTA FROM @s;
EXECUTE INSERTA;
END

pero el problema viene cuando _SQL (mi parametro) es algo parecido a esto:

START TRANSACTION WITH CONSISTENT SNAPSHOT;
DELETE FROM T_TABLA WHERE ID=2;
INSERT INTO T_TABLA(ID, X,Y)
VALUES( 2,452,1);
COMMIT;


es que precisamente necesito la funcion para mandar como parametro una cadena con todas las instrucciones SQL requeridas para asegurar que se ejecuten TODAS o NINGUNA.


Tendras alguna idea de como puedo hacerle en este caso?

osmuar_exp 12-06-2010 02:12:18

Transacción
 
Hola, creo que ya te entendí, una vez que inicias una transacción esta no se detiene hasta que la última sentencia incluida en ella se cumpla correctamente. Puedes realizar varias consultas a la base de datos y si en alguna de ellas pasa algo, todo lo que se se haya procesado se cancela, en otras palabras "se hace por que se hace o no se hace nada",, este es el ejemplo:

Código Delphi [-]
var consulta:tadoquery;
begin
  consulta:=tadoquery.Create(self);
  consulta:=frm_md.conexion;
  frm_md.conexion.BeginTrans;
  try
    with consulta do
     begin
       close;
       sql.text:='insert into.....';
       ExecSQL;

       close;
       sql.text:='delete from....';
       ExecSQL;

       Actualizar(0,'MEX',253,1);
     end;

     frm_md.conexion.CommitTrans;
     consulta.free;
  except
  on e:exception do
     begin
       frm_md.conexion.RollbackTrans;
       showmessage('Error en la transacción de tipo '+e.Message);
       consulta.free;
       exit;
     end;
  end;

Saludos transaccionales.

betto 12-06-2010 03:07:22

muchas gracias
 
si eso es lo que necesito, de hecho lo tengo en un modulo del sistema, pero queria ahorrar tiempo de procesamiento xq la red donde estoy corriendo el proyecto, esta lenta. pero creo que no quedara de otra mas que hacerlo instruccion por instruccion.

Te agradezco muchisimo, que tengas un excelente fin de semana.

rgstuamigo 12-06-2010 16:30:03

Solo agregar que ya existe una version de Zeos para trabajar en Delphi 2010 la version 7 que es una version Alpha, que puedes descargarla de la página oficial de Zeos exactamente desde Aquí.;)
Saludos...:)

betto 14-06-2010 21:30:52

Gracias!
 
GRACIAS!

Ya estoy trabajando con esto, gracias nuevamente.


La franja horaria es GMT +2. Ahora son las 08:53:41.

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