Domanda

Nel corso degli ultimi due giorni ho provato a scrivere una stored procedure in MySQL e ho qualche truble a farla funzionare. Spero che qualcuno qui può darmi qualche input:)

L'esempio che post è per asp.Net provider di appartenenze per creare un nuovo utente. Mi aspetto di inviare e-mail e la password per il DB e ottenere un int ritorno per verificare che i userdeatils è stato scritto nel DB.

Io uso un DB MySQL 5.1 (credo) e scrivere il codice SQL in un'interfaccia web.

Ho ottenuto 2 sidequestions, qualcuno può spiegare anche questo :): 1) Io uso un delimitatore, ma non so che cosa fa. 2) Non sono sicuro se devo fare altre cose poi per impostare autocommit = 0 per ottenere le transazioni al lavoro, o se ho nemmeno bisogno di farlo.

So che avrei potuto usare una dichiarazione if / else invece di una transazione, ma vorrei farlo con uno per scoprire come funziona. (Mi aspetto di usarlo alot in seguito)

Il codice non posso andare al lavoro:

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 ;

Modifica: Il messaggio di errore che ottengo è:

1064 - Hai un errore nella sintassi SQL; controllare il manuale che corrisponde alla versione del server MySQL per la sintassi diritto di utilizzare vicino a 'INT BEGIN SET autocommit = 0; DICHIARARE RETURN_VALUE INT; 'at line 4

Nessuna soluzione corretta

Altri suggerimenti

Per ottenere supporto per le transazioni, assicurarsi che si sta utilizzando il motore di memorizzazione InnoDB piuttosto che il MyISAM predefinita.

Per quanto riguarda quel codice stesso, la mia prima domanda sarebbe, perché stai involucro che singola query in una transazione? Inoltre, quali errori stai vedendo?

Il delimitatore ridefinisce ciò sequenza di caratteri che si utilizza per terminare un'istruzione SQL. L'intera procedura di creare è una dichiarazione grande ed è necessario dire a MySQL dove finisce con qualcosa (normalmente sarebbe ';'). Ma dal momento che si dispone di un sacco di altre dichiarazioni nel "corpo" (tra BEGIN ed END) della dichiarazione creare procedura che tutti hanno bisogno di essere finita troppo è necessario ridefinire il delimitatore in modo da non finire l'istruzione CREATE PROCEDURE al prima ';'.

senza ridefinire il delimitatore, MySQL potrebbe pensare che la procedura di creare dichiarazione si presentava così e poi iniziare una nuova dichiarazione:

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

    BEGIN
    SET autocommit = 0;

Utilizzo DELIMITER; alla fine dello script cambia il delimitatore di nuovo a ';' e non è necessario anche se è buona norma farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top