在CALL中YA MySQL错误#1064

时间:2013-09-14 09:17:58

标签: mysql stored-procedures mysql-error-1064

我创建了以下存储过程:

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行是错误,我感到非常困惑。我错过了什么超级明显的?

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服务。