谢谢,这是工作
这是在这两行:
SET valueName = CONCAT(valueName, ' ,', _valueSplit);
SET valueValue = CONCAT(valueValue,' ,', json(_entryData, _valueSplit));
我已经声明了变量,但是在NULL时所以CONCAT返回NULL并且查询转到NULL
感谢Devart帮助我当我尝试使用我的存储过程时出现此错误
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格式存储,如下所示: { “type”:“tableName”, “data”:“row1,row2,row3”, “row1”:“value”, “row2”:“value”, “row3”:“value” }
数据的类型(动作(连接,在墙上发布))它是我们的仪表板应用程序之一的表名称
“数据”是可用数据的列表
在我们拥有数据之后
答案 0 :(得分:1)
您必须在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。
答案 1 :(得分:1)
问题可以是用一个准备好的INSERT语句,似乎其中一个变量是NULL。尝试评论准备好的语句并选择@query,你会看到问题 -
SET @query = CONCAT('INSERT INTO ',_entryType, ' (',valueName,') VALUES (',valueValue,')' );
SELECT @query;
-- PREPARE stmt FROM @query;
-- EXECUTE stmt;
-- DEALLOCATE PREPARE stmt;