我创建了以下存储过程:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ABON_PLATA`(DATE_BAL1 datetime)
BEGIN
DECLARE IMSI1 varchar(6);
DECLARE DATE1 datetime;
DECLARE ID_U1 integer;
DECLARE PAY1 double;
DECLARE PAYSUM double;
DECLARE OLD1 double;
DECLARE REASON1 varchar(16);
DECLARE FLAG integer DEFAULT 0;
DECLARE C1 CURSOR FOR SELECT ID_U FROM podkl_otkl_uslug WHERE IMSI1=IMSI;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET FLAG=1;
OPEN C1;
REPEAT
FETCH C1 INTO ID_U1;
IF FLAG=0 THEN
SELECT SUM(PAY) INTO PAY1 FROM uslugi WHERE ID_U1=ID_U AND DATE_PODKL<DATE_BAL1 AND DATE_OTKL IS NULL;
SET REASON1 = 'ABON PLATA';
SET DATE1 = DATE_BAL1;
SET PAYSUM = `NEW`-PAY1;
SET OLD1 = `NEW`;
END IF;
INSERT history (`DATE`, REASON, `NEW`, OLD, IMSI) VALUES (DATE1, REASON1, PAYSUM, OLD1, IMSI1);
UNTIL FLAG=1
END REPEAT;
CLOSE C1;
END
用于模拟移动运营商的订阅费。当我试图调用它时,我得到了臭名昭著的错误:
CALL ABON_PLATA(2013-07-07 12:00:00);
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 '12:00:00)' at line 1
考虑到这是第 1 行的错误,我感到非常困惑。我错过了什么非常明显的东西?
最佳答案
日期时间文字必须用引号引起来。
CALL ABON_PLATA('2013-07-07 12:00:00');
它在第 1 行报告错误的原因是 CALL
行包含错误。它与您的过程代码无关,因为错误发生在它甚至可以调用您的过程之前。
回复你的评论:
Thread stack overrun: 6892 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.
这表明您的 MySQL 的 thread_stack
配置值太小,无法在存储过程中运行语句。例如,如果您使用与某些 MySQL 版本捆绑在一起的 my-small.cnf 配置文件,就会发生这种情况。
增加配置文件中thread_stack
的值。默认值为 256K,只有 my-small.cnf 将其设置得更低。有一个bug logged关于此设置太低。
在对配置文件进行此更改后,不要忘记重新启动 MySQL 服务。
关于mysql - YA MySQL Error #1064 in CALL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18800211/