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语法错误创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 6.3 - 在语法中创建过程错误

存储过程发出语法错误

MySQL 5.7 存储过程语法错误,通过 phpadmin 和 Ubuntu 16.04

MySQL:存储过程语法错误

mysql数据库创建表的时候,出现您的SQL语法有错误

试图在 Mysql 中创建存储过程的语法错误?