25

MySQL ストアド プロシージャを変更してトランザクション対応にしようとしています。既存のストアド プロシージャは問題なく正常に動作しますが、トランザクション対応にするとすぐに、変更を保存することさえできなくなります。MySQL のドキュメントを確認し、オンラインで検索しましたが、コードに問題は見つかりませんでした。それはかなり簡単なようですが、それを理解することはできません。

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

何か案が ?

4

3 に答える 3

6

2 つの構文エラー:

  • 終了ハンドラーの条件の間にコンマが必要です。構文ドキュメントにコンマが表示されていることに注意してください。

  • END終了ハンドラをセミコロンで終了する必要があります。DECLAREステートメント自体 (BEGIN...END ブロックを含む) は、他のステートメントと同様に、ターミネーターが必要です。

したがって、これが必要です:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;
于 2013-09-15T21:46:22.480 に答える
5

このようにしてみてください。つまり、DeclareステートメントをSTART TRANSACTION;. 以前は、 :-の上に書いたようにROLLBACK、の一部ではありませんでしたTRANSACTIONSTART TRANSACTION

BEGIN

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING

START TRANSACTION;

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
于 2013-09-15T20:27:48.803 に答える