简体   繁体   English

存储过程中的MySQL语法错误

[英]Mysql syntax error on stored procedure

I run this code as a sql script from command line, and I get "you have an error in your SQL syntax" almost in all lines! 我从命令行将这些代码作为sql脚本运行,并且几乎在所有行中都收到“您的SQL语法有错误”! Any ideas what is wrong here? 有什么主意在这里吗?

CREATE PROCEDURE updatemandate()
 BEGIN
   DECLARE _mandate_id BIGINT(20);
   DECLARE _has_succesful_payment tinyint(1);
   DECLARE done INT DEFAULT 0;
   DECLARE cnt INT;
   DECLARE mandateCursor CURSOR FOR Select mandate_id, has_succesful_payment From mandates;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
   OPEN mandateCursor;
   allmandates: LOOP
   Fetch mandateCursor INTO _mandate_id, _has_succesful_payment;
   IF done THEN LEAVE allmandates;
   END IF;
    Select COUNT(*) FROM payments WHERE mandate_id=_mandate_id AND status='OK' into cnt; 
            IF cnt>0 THEN
            SET _has_succesful_payment=1;
            END IF;

   END LOOP allmandates;
   CLOSE mandateCursor;
 END

The ; ; character is the default delimiter, so when MySQL sees the first ; 字符是默认的分隔符,因此当MySQL看到第一个分隔符时; it thinks you are done. 它认为您完成了。 When you create a sproc, you need to declare a different delimiter character, like so: 创建存储过程时,需要声明其他定界符,如下所示:

DELIMITER $$

CREATE PROCEDURE updatemandate()
READS SQL DATA
 BEGIN
   DECLARE _mandate_id BIGINT(20);
   DECLARE _has_succesful_payment tinyint(1);
   DECLARE done INT DEFAULT 0;
   DECLARE cnt INT;
   DECLARE mandateCursor CURSOR FOR Select mandate_id, has_succesful_payment From mandates;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
   OPEN mandateCursor;
   allmandates: LOOP
   Fetch mandateCursor INTO _mandate_id, _has_succesful_payment;
   IF done THEN LEAVE allmandates;
   END IF;
    Select COUNT(*) FROM payment WHERE mandate_id=_mandate_id AND status='OK' into cnt; 
            IF cnt>0 THEN
            SET _has_succesful_payment=1;
            END IF;

   END LOOP allmandates;
   CLOSE mandateCursor;
 END$$

DELIMITER ;

Also a good idea to add the READS SQL DATA to the sproc definition in case you need to support binary logging . 在需要支持二进制日志记录的情况下 ,将READS SQL DATA添加到sproc定义也是一个好主意。

您是否尝试过将delimiter //放在CREATE语句之前,并用END //更改最后一行?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM