Question

Au cours des deux derniers jours j'ai essayé d'écrire une procédure stockée dans MySQL et j'ai quelques truble le faire fonctionner. L'espoir que quelqu'un ici peut me donner quelques entrées:)

L'exemple que je poste est pour le fournisseur d'adhésion asp.Net pour créer un nouvel utilisateur. Je me attends à envoyer un courriel et mot de passe à la DB et obtenir un retour int pour vérifier que les userdeatils a été écrit dans le DB.

J'utilise un DB MySQL 5.1 (je pense) et écrire le SQL à une interface web.

Je suis 2 sidequestions, quelqu'un peut-il expliquer que trop :): 1) J'utilise un délimiteur, mais je ne sais pas ce qu'il fait. 2) Je ne sais pas si je dois faire d'autres choses alors de mettre autocommit = 0 pour obtenir les transactions à travailler ou si je dois encore le faire.

Je sais que je aurais pu utiliser une instruction IF / ELSE au lieu d'une transaction, mais je voudrais le faire avec un pour savoir comment cela fonctionne. (Je pense à l'utiliser beaucoup d'hôtels plus tard)

Le code que je ne peux pas travailler:

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 ;

Edit: Le message d'erreur que je reçois est:

1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de « INT BEGIN SET autocommit = 0; DECLARE return_value INT; 'à la ligne 4

Pas de solution correcte

Autres conseils

Pour obtenir un soutien pour les transactions, assurez-vous que vous utilisez le moteur de stockage InnoDB plutôt que MyISAM par défaut.

En ce qui concerne ce code lui-même, ma première question serait, pourquoi vous envelopper cette requête unique dans une transaction? En outre, quelles sont les erreurs que vous voyez?

Le delimiter redéfinit ce que la séquence de caractères que vous utilisez pour mettre fin à une instruction SQL. L'ensemble de la procédure est de créer une grande déclaration et vous avez besoin de dire MySQL où il se termine par quelque chose (qui serait normalement « ; »). Mais puisque vous avez un tas d'autres déclarations dans le « corps » (entre begin et END) de la create procédure que doivent tous être pris fin trop vous devez redéfinir le séparateur afin de ne pas l'instruction create procédure au premier ';'.

Sans redéfinir le délimiteur, MySQL pourrait penser que la create procédure ressemblait à ceci et commencer une nouvelle déclaration:

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

    BEGIN
    SET autocommit = 0;

Utilisation DELIMITER; à la fin du script change le delimiter retour à « ; » et n'est pas nécessaire mais il est bon de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top