web-dev-qa-db-fra.com

Comment puis-je utiliser des transactions dans ma procédure stockée MySQL?

J'essaie de modifier ma procédure stockée MySQL et de la rendre transactionnelle. La procédure stockée existante fonctionne correctement sans problème, mais dès que je la rend transactionnelle, elle ne me permet même pas d'enregistrer mes modifications. J'ai vérifié la documentation MySQL et recherché en ligne mais je ne trouve aucun problème avec mon code. Cela semble assez simple, mais je ne peux pas le comprendre.

BEGIN

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION SQLWARNING
BEGIN
    ROLLBACK;
END

START TRANSACTION;

    -- ADD option 5
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0);
    SET poid = (SELECT LAST_INSERT_ID());
    INSERT INTO product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,price_prefix,points,points_prefix,weight,weight_prefix) VALUES(poid,insertedProductID,5,50,0,0,4.99,'+',0,'+',0,'+');

    -- ADD option 12
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1);

    -- ADD option 13
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,13,0);

COMMIT;

END

une idée ?

24
Tohid

Deux erreurs de syntaxe:

  • Vous avez besoin de virgules entre les conditions de votre gestionnaire de sortie. Remarquez que la documentation de la syntaxe montre des virgules.

  • Vous devez terminer le END du gestionnaire de sortie par un point-virgule. L'instruction DECLARE elle-même (y compris son bloc BEGIN ... END) est une instruction comme les autres et doit avoir un terminateur.

Vous avez donc besoin de ceci:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;
5
Bill Karwin

Essayez comme ceci, c'est-à-dire, incluez votre instruction Declare dans le START TRANSACTION;. Auparavant, votre ROLLBACK ne faisait pas partie de TRANSACTION comme vous l'avez écrit au-dessus du START TRANSACTION: -

BEGIN

START TRANSACTION;

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END

    -- ADD option 5
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0);
    SET poid = (SELECT LAST_INSERT_ID());
    INSERT INTO product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,price_prefix,points,points_prefix,weight,weight_prefix) VALUES(poid,insertedProductID,5,50,0,0,4.99,'+',0,'+',0,'+');

    -- ADD option 12
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1);

    -- ADD option 13
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,13,0);

COMMIT;

END
5
Rahul Tripathi