1

我需要在我们公司的 MySQL 服务器上添加一个新的存储过程。因为它只是略有不同,我使用了一个已经存在的,添加了附加字段并更改了过程的名称。现在奇怪的是,当我想执行该语句时,它返回:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

引用此行中的 0: SET @update_id := 0; 奇怪的是,我使用 SHOW CREATE PROCEDURE 查询了该存储过程。它保存在我们的数据库中并且工作正常。我只是不能将它用作新的存储过程(无论我是尝试将它应用到新的测试数据库还是通过给它一个新名称在现有数据库上使用它)。我在互联网上搜索了解决方案。不幸无济于事。我什至设置了一个新数据库,其中包含一个新表和一些演示值,我尝试在其中执行原始的、未更改的存储过程。它返回完全相同的错误。

这是我正在谈论的当前使用和工作的存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `customer_getcard`(IN Iinstance INT, IN Itimebuy DOUBLE, IN Iprice DECIMAL(10,2), IN Itariff INT, IN Icomment VARCHAR(128))
BEGIN
  SET @update_id := 0;
  UPDATE customer_shop SET state = 1, id = (SELECT @update_id := id), instance=Iinstance, timebuy=Itimebuy, price=Iprice, comment=Icomment WHERE tariff=Itariff AND state = 0 LIMIT 1; 
  SELECT * FROM customer_shop WHERE id = @update_id;
END

我希望你们能帮助我,因为我完全不知道出了什么问题。:/

问候,马克

4

2 回答 2

1

您需要定义一个替代的命令分隔符,因为 MySQL 当前认为您的命令在它遇到CREATE PROCEDURE的第一个结束处(在第 3 行,在 之后),这将是一个语法错误,因为它在 a 之后但在相应的 之前:;0BEGINEND

DELIMITER ;; -- or anything else you like

CREATE PROCEDURE
  ...
END;;        -- use the new delimiter you chose above here

DELIMITER ;  -- reset to normal
于 2012-05-02T10:27:35.730 回答
0

MySQL存储过程不使用“:=”进行赋值,只使用“=”。

也不要认为“id = (SELECT @update_id := id)”是可以接受的。这是一个替代解决方案(未经测试):

CREATE DEFINER=`root`@`localhost` PROCEDURE `customer_getcard`(IN Iinstance INT, IN Itimebuy DOUBLE, IN Iprice DECIMAL(10,2), IN Itariff INT, IN Icomment VARCHAR(128))
BEGIN
  select id into @update_id from customer_shop WHERE tariff=Itariff AND state = 0 LIMIT 1;
  UPDATE customer_shop SET state = 1, instance=Iinstance, timebuy=Itimebuy, price=Iprice, comment=Icomment where id = @update_id;
  SELECT * FROM customer_shop WHERE id = @update_id;
END

如果没有要编辑的匹配行,您可能还需要放置错误处理程序。

于 2012-05-02T09:59:01.713 回答