我需要在我们公司的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
我希望你们可以帮助我,因为我完全没有想法会出错。 :/
问候,马克
答案 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
您可能还想放置错误处理程序,以防没有要编辑的匹配行。