Pergunta

Nos últimos dias, tentei escrever um procedimento armazenado no MySQL e tenho alguns trufos fazendo com que funcione. Espero que alguém aqui possa me dar alguma contribuição :)

O exemplo que eu publico é para o fornecedor de associação do ASP.NET criar um novo usuário. Espero enviar e -mail e senha para o banco de dados e obter um retorno int para verificar se o UserDeatils foi gravado no banco de dados.

Eu uso um MySQL DB 5.1 (eu acho) e escrevo o SQL em uma WebInterface.

Eu tenho 2 perguntas laterais, alguém também pode explicar isso :): 1) Uso um delimitador, mas não sei o que faz. 2) Não tenho certeza se tenho que fazer outras coisas para definir o AutoCommit = 0 para fazer com que as transações funcionem ou se eu tenho que fazer isso.

Sei que poderia ter usado uma instrução IF / else em vez de uma transação, mas gostaria de fazê -lo com uma para descobrir como ela funciona. (Espero usá -lo muito mais tarde)

O código que não consigo trabalhar:

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: a mensagem de erro que recebo é:

1064 - Você tem um erro na sua sintaxe SQL; Verifique o manual que corresponde à sua versão do MySQL Server para obter a sintaxe correta para usar perto de 'int Begin Set AutoCommit = 0; Declarar return_value int; 'Na linha 4

Nenhuma solução correta

Outras dicas

Para obter suporte para transações, verifique se você está usando o mecanismo de armazenamento Innodb e não o Myisam padrão.

Quanto a esse código em si, minha primeira pergunta seria: por que você está envolvendo essa consulta única em uma transação? Além disso, que erros você está vendo?

O delimitador redefine qual sequência de caracteres você usa para encerrar uma instrução SQL. Todo o procedimento de criação é uma grande declaração e você precisa dizer ao MySQL onde termina com alguma coisa (normalmente seria ';'). Mas como você tem várias outras declarações no "corpo" (entre o início e o fim) da declaração de procedimento de criação de que todos precisam ser encerrados também, é necessário redefinir o delimitador para não encerrar a declaração de procedimento de criação no The the primeiro ';'.

Sem redefinir o delimitador, o MySQL pensaria que a declaração de procedimento de criação parecia assim e depois inicia uma nova declaração:

CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
    IN _username VARCHAR(100),
    IN _Password VARCHAR(100))
    RETURNS INT

    BEGIN
    SET autocommit = 0;

Usando delimiter; No final do script muda o delimitador de volta para ';' e não é necessário, embora seja uma boa prática fazê -lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top