MySQL中存储过程的奇怪问题

时间:2012-05-02 08:58:18

标签: mysql stored-procedures

我需要在我们公司的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

我希望你们可以帮助我,因为我完全没有想法会出错。 :/

问候,马克

2 个答案:

答案 0 :(得分:1)

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

之前
DELIMITER ;; -- or anything else you like

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

DELIMITER ;  -- reset to normal

答案 1 :(得分: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

您可能还想放置错误处理程序,以防没有要编辑的匹配行。