1

我正在尝试在 mysql 上创建一个程序,这并不难,但是当使用“如果”事情变得疯狂时,它说有一个错误,但我无法理解。它是这样的:

CREATE SP_Verify_DATE (IN comp INT,IN prod INT,IN qt INT)
BEGIN
SELECT COUNT(cd_compra) INTO @tes FROM produto_compra WHERE cd_produto=prod AND cd_compra=comp;

IF (@tes = 1) THEN

UPDATE produto_compra WHERE cd_produto=prod AND cd_compra=comp SET qt_produto = qt_produto + qt;
ELSE 

INSERT INTO produto_compra VALUES(comp,prod,qt);

END IF;

END

非常感谢彼得!有效!!!!我失去了 2 晚试图找到错误的东西,你的想法比我使用它的程序要好,再次感谢!

4

1 回答 1

2

您的代码有几个问题:

  1. 您必须使用CREATE PROCEDURE而不仅仅是CREATE;
  2. 你的UPDATE语法错误。在子句SET之前。WHERE
  3. 你需要改变DELIMITER

尝试

DELIMITER $$
CREATE PROCEDURE SP_Verify_DATE (IN comp INT, IN prod INT, IN qt INT)
BEGIN
  SELECT COUNT(cd_compra) 
    INTO @tes 
    FROM produto_compra 
   WHERE cd_produto=prod 
     AND cd_compra=comp;

  IF (@tes = 1) THEN
    UPDATE produto_compra
       SET qt_produto = qt_produto + qt
     WHERE cd_produto=prod AND cd_compra=comp;
  ELSE 
    INSERT INTO produto_compra VALUES(comp,prod,qt);
  END IF;
END$$
DELIMITER ;

除此之外,您的代码还可以。

这是SQLFiddle演示


现在,如果您有或者如果您使用语法定义了一个唯一索引(cd_produto, cd_compra)(并遵循您的代码逻辑,您应该有这样的约束),您现在可以将整个事情归结为一个插入语句INSERT INTO ... ON DUPLICATE KEY UPDATE

CREATE PROCEDURE SP_Verify_DATE (IN comp INT, IN prod INT, IN qt INT)
  INSERT INTO produto_compra (cd_produto, cd_compra, qt_produto)
  VALUES(comp, prod, qt)
  ON DUPLICATE KEY UPDATE qt_produto = qt_produto + VALUES(qt_produto);

由于它现在是单语句 SP,因此您甚至不需要使用BEGIN ... END块和更改分隔符。

显然,如果您需要,您可以完全退出存储过程并自行使用此类插入语句。

这是SQLFiddle演示

于 2013-07-18T05:11:13.770 回答