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

两个语法错误:

  • 您需要在退出处理程序的条件之间使用逗号。请注意语法文档显示逗号。

  • 您需要END用分号终止退出处理程序。语句本身(包括它的DECLAREBEGIN...END 块)与任何其他语句一样,需要有一个终止符。

所以你需要这个:

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

像这样尝试,即,将您的Declare声明包含在START TRANSACTION;. 早些时候,你ROLLBACK不是TRANSACTION你在上面写的START 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 回答
-1

把你DECLARE的 s 放在第一个之后BEGIN,它应该可以工作。

如果使用 BEGIN 和 END 对多个语句进行分组,通常还需要在顶部声明一个备用 DELIMITER 并替换 ; 在最后一个 END 之后。

于 2019-05-16T14:39:20.163 回答