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
何か案が ?
2つの構文エラー:
終了ハンドラーの条件の間にはコンマが必要です。 構文のドキュメント がコンマを示していることに注意してください。
終了ハンドラのEND
をセミコロンで終了する必要があります。 DECLARE
ステートメント自体(BEGIN ... ENDブロックを含む)は他のステートメントと同様であり、ターミネーターが必要です。
これが必要です:
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
ROLLBACK;
END;
このように試してください。つまり、Declare
ステートメントをSTART TRANSACTION;
内に含めます。以前のROLLBACK
は、START TRANSACTION
の上に書いたように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