PDA

Ver la Versión Completa : Parametros + Stored Procedure


betto
11-06-2010, 00:20:01
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
Hola, con este procedimiento que debes de crear te modifica la tabla, solamente que debes de mandarle los parametros...

1) Procedimiento Almacenado
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 procedimientoprocedure 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: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
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:

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
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 (http://zeos.firmos.at/portal.php) de Zeos exactamente desde Aquí (http://zeosdownloads.firmos.at/downloads/releases/ZEOSDBO-7.0.0-alpha.zip).;)
Saludos...:)

betto
14-06-2010, 21:30:52
GRACIAS!

Ya estoy trabajando con esto, gracias nuevamente.