我创建了以下存储过程:
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行是错误,我感到非常困惑。我错过了什么超级明显的?
答案 0 :(得分:0)
日期时间文字必须是引号。
CALL ABON_PLATA('2013-07-07 12:00:00');
它在第1行报告错误的原因是它是包含错误的CALL
行。它与您的过程代码无关,因为错误在它甚至可以调用您的过程之前发生。
重新评论:
线程堆栈溢出:用于131072字节堆栈的6892个字节,需要128000个字节。使用'mysqld --thread_stack =#'指定更大的堆栈。
这表明您的MySQL的配置值thread_stack
太小,无法在存储过程中运行语句。例如,如果您使用与某些MySQL版本捆绑在一起的 my-small.cnf 配置文件,就会发生这种情况。
增加配置文件中thread_stack
的值。默认值为256K,并且只有my-small.cnf将其设置得更低。关于此设置的bug logged太低了。
在对配置文件进行此更改后,不要忘记重新启动MySQL服务。