Mysql语法错误创建存储过程
Posted
技术标签:
【中文标题】Mysql语法错误创建存储过程【英文标题】:Mysql syntax error creating stored procedure 【发布时间】:2014-04-18 18:31:57 【问题描述】:这让我发疯了。
CREATE DEFINER=`root`@`localhost` PROCEDURE `CalcularCRTarea` (Id_Tarea INT, OUT crTarea decimal(12, 4))
DETERMINISTIC
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE _id BIGINT UNSIGNED;
DECLARE cur CURSOR FOR SELECT Id FROM Tarea_Frente where Id_Item_Tarea = Id_Tarea;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
OPEN cur;
testLoop: LOOP
FETCH cur INTO _id;
IF done THEN
LEAVE testLoop;
ELSE
CALL CalcularCRFrente(_id, @suma);
SET crTarea = crTarea + @suma;
END IF;
END LOOP testLoop;
CLOSE cur;
END;
phpmyadmin
回我
mysql said: Documentation
#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 4
那就是那一行
DECLARE done BOOLEAN DEFAULT FALSE;
这里有什么问题?我尝试了一些小的更改,但我总是遇到同样的错误。我检查了文档,但没有看到语法错误。 我知道这是一个愚蠢的错误,但我坚持了半个小时。 是一个游标,它遍历每一行并为每一行执行一个存储过程;我已经使用存储函数完成了它(它就像一个魅力)但是在服务器上发布时我看到我的共享主机不支持存储函数,只支持存储过程:(所以这是我最好的方式找到了。
【问题讨论】:
我在 MySQL 5.6.16 上进行了测试,它工作正常,没有错误。你确定你发布了正确的代码吗?当您在此处发布时,是否有任何隐藏的奇怪空白字符被过滤掉了? 这是正确的代码。我想到了隐藏的奇怪空白,但我在每个“;”之后删除了每个人。我正在使用 MySQL 5.5.35 【参考方案1】:您缺少自定义 delimiter
指令。
正如您所忽略的,引擎在找到第一个默认语句终止符分号;
时尝试编译语句。因此例外。
把你的整个日常安排放在两者之间:
-- define the delimiter
delimiter //
--- place here your stored procedure
-- and lastly following line
//
-- reset the delimiter
delimiter ;
【讨论】:
太棒了,它奏效了。我认为这不是必需的,因为在某些情况下我可以在不使用它的情况下创建存储。为什么是必要的? 我想这一定是正确的原因,你猜到了还是试过了? @Gonzalo.-:通常存储过程(包括触发器)包含一组可执行语句。但它们都是一个整体的一部分,而不是单独的陈述。要将它们分组,我们需要使用新语句或块终止符来指示引擎。它是使用delimiter
完成的。
@Gonzalo.-:通常大多数基于 GUI 的 SQL 解释器都不允许您使用它们。您还可以在 SQL Fiddle 上看到它有一个下拉列表,可以选择自定义分隔符用于您的语句。
是的,phpmyadmin上面有个delimiter选项,我刚刚看到了以上是关于Mysql语法错误创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章