MySQL - MySQL: Stored procedures y transacciones

   
Vista:

MySQL: Stored procedures y transacciones

Publicado por Miguel Angel (4 intervenciones) el 26/09/2007 16:32:04
Hola como estan?

Pues tengo un par de dudas... bueno son mas jejeje

Estoy desarrollando una aplicacion para mi trabajo, VB .net + MySQL con el motor de almacenamiento InnoDB, para poder hacer uso de transacciones y otras cosas.

En primer lugar, quiero manejar lo que son stored procedures, solo que me quede estancado a la hora de usar transacciones, ya que no se como hacer uso de las excepciones en MySQL (que al momento de que no pueda insertar un registro a una tabla por X motivo, me haga el rollback). Aqui les pongo parte de mi codigo:

En VB llamo a una funcion la cual ejecuta mi codigo MySQL:
[CODE]Ejecuta("call ProcInsCta('" & numcta & "','" & txtnombre.Text & "','" & tcuenta & "','" & ctamayor & "','" & fechacuenta & "','" & clase & "','" & subcuenta & "')")[/CODE]

Funcion ejecuta
[CODE]Public Sub Ejecuta(ByVal sComando As String)
Dim commmySQL As MySqlCommand
Try
commmySQL = New MySqlCommand(sComando, cn)
commmySQL.ExecuteNonQuery()
Catch e As MySqlException
MessageBox.Show("No se puede llevar a cabo la operación. Detalle del error: " & e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop)
merr = True
Finally
End Try
End Sub[/CODE]

Hasta ahi, al parecer todo bien... igual tendria que modificar la funcion. Eso ustedes me lo podrian sugerir.

En mi BD tengo un stored procedure llamado ProcInsCta:
[CODE]CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcInsCta`(numcta char(9),nombcta varchar(90),tcuenta char(1),ctamayor char(1),fechacuenta char(10),clase char(1), subcta char(9))
BEGIN
declare numerocta char(9);
declare subctade char(9);
select cuenta from `cont-cuenta` into numerocta where `cuenta`=numcta; #me marca error aqui... no se porque :S
if numerocta <> NULL then
return 'La cuenta que intenta agregar ya existe'; #mi idea aqui es que regrese este mensaje y se despliegue en mi messagebox... alguien sabe como lo podria hacer?
else
select cuenta from `cont-cuenta` into subctade where `cuenta`=subcta;
if subcta = NULL then
return 'El numero de la cuenta superior no existe';#mi idea aqui es que regrese este mensaje y se despliegue en mi messagebox... alguien sabe como lo podria hacer?
else
else
set autocommit=0;
start transaction WITH CONSISTENT SNAPSHOT;
insert into `cont-cuenta` (cuenta,nombre,tipo,mayor,fechalta,clase) values (numcta,nombcta,tcuenta,ctamayor,fechacuenta,clase);
if #en este if, la idea es que recupere el mensaje de la consulta anterior, si hay error haga el rollback, sino, que se pase al else para hacer commit
rollback;
else
commit;
end if
if ctamayor<>'3' then
insert into `cont-ctasoc` (ctasup,subcta) values (numcta,subcta);
end if;
end if;
end if;
END[/CODE]

Mas que nada quisiera saber si la sintaxis de mi procedimiento esta bien, como manejo los errores en MySQL, si la sintaxis del uso de transacciones esta bien y si me hace falta algo mas para que funcione mejor.

Se daran cuenta que la aplicacion esta en Windows. El servidor de MySQL corre en Windows 2003 Server, la aplicacion la estoy programando en VB.net 2005 en Windows XP.

Saludos y espero sus comentarios :D
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:MySQL: Stored procedures y transacciones

Publicado por kain (124 intervenciones) el 26/09/2007 20:40:56
en este enlace tienes toda la informacion que necesitas.

http://dev.mysql.com/doc/refman/5.0/es/create-procedure.html

no voy a intentar explicarte los errores porque lo unico que esta bien son los declare.

hay cosas que no se pueden hacer desde una procedure y para eso estan las functions.

hazme caso repasa el link. te aclarara muchas cosas.

suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:MySQL: Stored procedures y transacciones

Publicado por Miguel Angel (4 intervenciones) el 27/09/2007 19:06:56
¬¬

Gracias por tu respuesta, pero la verdad ya habia consultado el manual de MySQL, y me quedaron dudas, por eso vine a postear mi problema aqui.

Afortunadamente ya funciono mi procedimiento, solo que ahora quiero saber como manejar los errores, y que cuando se haga el rollback poder saber por medio de un mensaje en mi aplicacion el motivo por el cual no aplico mi movimiento.

Revise la documentacion de MySQL, y no me queda aun claro, por eso posteo aca.

Saludos XD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:MySQL: Stored procedures y transacciones

Publicado por Miguel Angel (4 intervenciones) el 01/10/2007 18:33:13
Hola foreros, como les va?

Pues sigo con la misma duda...

He intentado retornar el valor de una variable de tipo INT de un stored procedure en MySQL a una aplicación de VB .net 2005. Ya tengo la conexión y todo el rollo, ya puedo grabar en mi BD sin problemas.

Desde VB hago la llamada del stored procedure con esta linea:
[CODE]Ejecuta("call ProcInsCta('" & numcta & "','" & txtnombre.Text & "','" & tcuenta & "','" & ctamayor & "','" & fechacuenta & "','" & clase & "','" & subcuenta & "','" & msg & "')")[/CODE]

Donde msg es el parametro OUT de tipo entero para el stored procedure... aqui les paso el procedimiento:

[CODE]CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcInsCta`(numcta char(9), nombcta varchar(90), tcuenta char(1), ctamayor int, fechacuenta char(10), clase char(1), subcta char(9), OUT mensaje int)
BEGIN
#declare mensaje int;
set @numerocta= NULL, @subctade= NULL, @cmayscta=NULL;
set autocommit=0;
start transaction WITH CONSISTENT SNAPSHOT;
select cuenta into @numerocta from `cont-cuenta` where `cuenta`=numcta;
if @numerocta = numcta then
set mensaje = 0;
else
insert into `cont-cuenta` (cuenta,nombre,tipo,mayor,fechalta,clase) values (numcta,nombcta,tcuenta,ctamayor,fechacuenta,clase);
show count(*) errors;
if @@error_count > 0 then
rollback;
set mensaje = 1;
else
if ctamayor<>1 then
if @subctade <> subcta then
rollback;
set mensaje = 2;
else
if @cmayscta <= ctamayor then
show count(*) errors;
if @@error_count > 0 then
rollback;
set mensaje = 3;
else
commit;
set mensaje = 4;
end if;
else
rollback;
set mensaje = 5;
end if; ########
end if;
else
commit;
set mensaje = 6;
end if;
end if;
end if;
END[/CODE]

Dentro del procedimiento le asigno a mensaje (parametro de salida de tipo INT) un valor entero, y ese valor lo quiero de regreso en mi aplicacion VB dentro de la variable msg... pero me marca un error, el cual no se si sea por cuestion de MySQL que aun ande mal en el paso de parametros de salida o sea en la forma en la cual llamo al procedimiento... este es el error que me manda:

[CODE]OUT or INOUT argument 8 for routine sglamesa.ProcInsCta is not a variable or NEW pseudo-variable in BEFORE trigger[/CODE]

Espero su ayuda :D

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:MySQL: Stored procedures y transacciones

Publicado por Marco Quintana (1 intervención) el 30/10/2007 15:00:43
Hola, si quieres tratar los errores te recomiendo que uses Handlers:
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;
OPEN cur2;

REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;

CLOSE cur1;
CLOSE cur2;
END

En este procedimiento HANDLER 02000 ocurre al llegar al ultimo registro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:MySQL: Stored procedures y transacciones

Publicado por edgar (1 intervención) el 07/11/2007 17:01:34
creo que lo que intentas hacer lo he solucionado de la siguiente manera,tambien queria utiliza parametros de salida (out var int )
------------------------
declare var (varchar(10))

select id
into var
from table
where id=10;
select var;
-----------------------

entonces tu puedes recuperar en un dataSet el valor de var y utilizarlo como creas
--------

Ahora quiciera que me des una mano con esto de commit o roll back transactions en un stored procedure de Mysql ......

como utilizo esto puedes explicarme un poco o enviarme a mi correo la respuesta es urg....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar