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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top