【问题标题】:MySQL Error 1064 : Stored procedureMySQL 错误 1064:存储过程
【发布时间】:2012-06-08 11:12:32
【问题描述】:

谢谢,成功了

它在这 2 行:

SET valueName = CONCAT(valueName, ' ,', _valueSplit);
SET valueValue = CONCAT(valueValue,' ,', json(_entryData, _valueSplit));

我已经声明了变量,但是在 NULL 所以 CONCAT 返回 NULL 并且查询继续 NULL 到

感谢德瓦特帮助我


帖子:

当我尝试使用存储过程时出现此错误

call _extract() Error Code: 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 'NULL' at line 1

但我在程序中什么也没看到 这是我的程序,但上面没有指令 NULL

CREATE PROCEDURE _extract()
BEGIN
    DECLARE _entryType VARCHAR(45);
    DECLARE _entryData VARCHAR(1024);
    DECLARE _entryTime BIGINT(20);

    DECLARE no_more_rows BOOLEAN;
    DECLARE num_rows INT DEFAULT 0;

    DECLARE entryCursor CURSOR FOR SELECT entryValue, entryTime FROM TrackingEntry;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;

    OPEN entryCursor;
    select FOUND_ROWS() into num_rows;

    mainLoop: LOOP

        FETCH entryCursor INTO _entryData, _entryTime;

        IF no_more_rows THEN
            CLOSE entryCursor;
            LEAVE mainLoop;
        END IF;

        SET _entryType = json(_entryData, "type");
        CALL split_string(json(_entryData, "data"), ",");
        CALL _extractJson(_entryType, _entryData);

    END LOOP mainLoop;
END$$

_extractJson 程序: 下一部分数据的提取

CREATE PROCEDURE _extractJson(`_entryType` VARCHAR(255))
BEGIN

    DECLARE _valueSplit VARCHAR(255);

    DECLARE valueName VARCHAR(255);
    DECLARE valueValue VARCHAR(255);

    DECLARE split_no_more_rows BOOLEAN;
    DECLARE split_num_rows INT DEFAULT 0;

    DECLARE splitCursor CURSOR FOR SELECT SQL_CALC_FOUND_ROWS _value FROM SplitValues;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET split_no_more_rows = TRUE;

    OPEN splitCursor;
    select FOUND_ROWS() into split_num_rows;
    dataLoop: LOOP
        FETCH splitCursor INTO _valueSplit;
        IF split_no_more_rows THEN
            CLOSE splitCursor;
            LEAVE dataLoop;
        END IF;

        SET valueName = CONCAT(valueName, ' ,', _valueSplit);
        SET valueValue = CONCAT(valueValue,' ,', json(_entryData, _valueSplit));

    END LOOP dataLoop;
    SET @query = CONCAT('INSERT INTO ',_entryType, ' (',valueName,') VALUES (',valueValue,')' );
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    --end stuffs here
END$$

解释我想做什么

一些数据存储在 trackingEntry 中,每一行都包含有关用户做什么(在社交游戏中)和他来自哪里(动作、引荐来源和其他一些值)的信息

这些数据以 Json 格式存储,如下所示: { “类型”:“表名”, “数据”:“第 1 行,第 2 行,第 3 行”, "row1" : "值", “row2”:“值”, “row3”:“价值” }

数据的类型(操作(连接、在墙上发布))它是我们仪表板应用程序之一的表名

“数据”是可用数据的列表

在我们得到数据之后

【问题讨论】:

  • 问题可能出在您从该过程调用的另一个过程或函数中。请提供jsonsplit_string_extractJson例程,或尝试调试。
  • Json 和 split_str,完美运行,我已经分别测试了它们,我将编辑添加 _extractJson
  • 我在您的代码中看不到任何错误。尝试注释调用其他路由的行并再次运行_extract;-)
  • 当我评论 CALL _extractJson(_entryType, _entryData);它的工作——”所以它在 _extractJson()

标签: mysql mysql-error-1064


【解决方案1】:

问题可能出在准备好的 INSERT 语句上,似乎其中一个变量为 NULL。尝试注释prepared statements并选择@query,你会看到问题-

SET @query = CONCAT('INSERT INTO ',_entryType, ' (',valueName,') VALUES (',valueValue,')' );
SELECT @query;
-- PREPARE stmt FROM @query;
-- EXECUTE stmt;
-- DEALLOCATE PREPARE stmt;

【讨论】:

  • 确实...@query 为空...但如果“_entryType”或其他为空,则字符串必须包含,像“插入”这样的常量部分对吗?
  • @query 为 NULL,因为 _entryTypevalueNamevalueValue 之一为 NULL。从文档中 - 如果任何参数为 NULL,则 CONCAT() 返回 NULL。 dev.mysql.com/doc/refman/5.5/en/…
  • Debugger for MySQL(试用试用版)。
  • 谢谢,它的工作它在这 2 行: SET valueName = CONCAT(valueName, ' ,', _valueSplit); SET valueValue = CONCAT(valueValue,' ,', json(_entryData, _valueSplit));我已经声明了变量,但是在 NULL 所以 CONCAT 返回 NULL 并且查询继续 NULL 感谢 Devart 帮助我
【解决方案2】:

您必须在 select 语句中添加SQL_CALC_FOUND_ROWS,以便FOUND_ROWS() 函数起作用。

所以改变这一行

DECLARE entryCursor CURSOR FOR SELECT entryValue, entryTime FROM TrackingEntry;

喜欢这个

DECLARE entryCursor CURSOR FOR SELECT SQL_CALC_FOUND_ROWS entryValue, entryTime FROM TrackingEntry;

您可以阅读更多关于它的信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-22
    • 2018-06-21
    • 1970-01-01
    • 2012-08-02
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多