Tratando de aprender MySQL y transacciones
-
19-09-2019 - |
Pregunta
Durante el último par de días me han tratado de escribir un procedimiento almacenado en MySQL y tengo algo de truble conseguir que funcione. Espero que alguien aquí me puede dar alguna entrada:)
El ejemplo he puesto es para el proveedor de pertenencia asp.Net para crear un nuevo usuario. Espero para enviar correo electrónico y una contraseña para la base de datos y obtener un retorno int para verificar que los userdeatils se escriben en la base de datos.
Yo uso una base de datos MySQL 5.1 (creo) y escribir el código SQL a una interfaz web.
Me dieron 2 sidequestions, alguien puede explicar que también :): 1) Yo uso un delimitador, pero no sé lo que hace. 2) No estoy seguro de si tengo que hacer otras cosas a continuación para establecer el compromiso automático = 0 para obtener transacciones para trabajar, o si incluso tengo que hacer eso.
Sé que podría haber utilizado una instrucción IF / ELSE en lugar de una transacción, pero me gustaría hacerlo con uno para averiguar cómo funciona. (Espero usarlo hay mucho más tarde)
El código no puedo conseguir que funcione:
DELIMITER //
CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
IN _username VARCHAR(100),
IN _Password VARCHAR(100))
RETURNS INT
BEGIN
SET autocommit = 0;
DECLARE return_value INT;
BEGIN TRY
START TRANSACTION
INSERT INTO User
(Email
,Password
,Failed_Password_Count
,Creation_Date)
VALUES
(_username
,_Password
,0
,Datetime.Now())
SET return_value = 1;
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK
SET return_value = 0;
END CATCH
BEGIN FINALLY
RETURN return_value;
END FINALLY
END//
DELIMITER ;
Editar: El mensaje de error que consigo es:
1064 - Usted tiene un error en su sintaxis SQL; compruebe el manual que corresponde a su versión del servidor MySQL para el sintaxis derecho al uso cerca de 'INT COMENZAR SET confirmación automática = 0; DECLARE INT valor_devuelto; 'en la línea 4
No hay solución correcta
Otros consejos
Para obtener soporte para transacciones, asegúrese de que está utilizando el motor de almacenamiento InnoDB en lugar de la MyISAM por defecto.
En cuanto a que el código en sí, mi primera pregunta sería, ¿por qué estás envolviendo esa consulta individual en una transacción? Además, ¿qué errores estás viendo?
El delimitador redefine qué secuencia de caracteres que se utiliza para terminar una instrucción SQL. Todo el procedimiento de crear es una gran declaración y hay que decir a MySQL donde termina con algo (que normalmente sería ';'). Pero ya que usted tiene un montón de otros estados en el "cuerpo" (entre BEGIN y END) de la sentencia de creación procedimiento que todos necesitan ser terminado también necesita redefinir el delimitador para que no terminen la sentencia de procedimiento de crear en el primero ';'.
Sin redefinir el delimitador, MySQL podría pensar que la sentencia de procedimiento de crear veía así, y comenzará una nueva declaración:
CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
IN _username VARCHAR(100),
IN _Password VARCHAR(100))
RETURNS INT
BEGIN
SET autocommit = 0;
Uso DELIMITER; al final de la secuencia de comandos cambia el delimitador de nuevo a ';' y no se necesita aunque es una buena práctica para hacerlo.