MYSQL 迭代 Json 数组数据的存储过程
MYSQL Stored Procedure to Iterate Json Array Data
我有几列是 json 数组,它们具有这样的日期时间数据:
["2017-04-18 11:05:00.000000"]
["2017-04-20 11:05:00.000000"]
["2017-04-22 11:05:00.000000"]
["2017-12-11 22:14:02.000000", "2017-12-11 22:14:08.000000", "2017-12-11 22:19:13.000000", "2017-12-11 22:20:44.000000", "2017-12-11 22:21:54.000000", "2017-12-11 22:23:09.000000"]
["2017-12-13 13:21:04.000000"]
["2017-12-14 13:10:44.000000", "2017-12-14 13:21:51.000000"]
["2017-12-15 13:27:21.000000", "2017-12-15 13:30:21.000000"]
["2017-12-16 15:15:22.000000"]
目标是解析日期时间数据并将其存储到一个单独的 table 中,我计划从中做一些有趣的事情。目前,它只插入第一条记录,它插入了 ~180000 次。我当前的代码是:
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE i INTEGER DEFAULT 0;
DECLARE usages VARCHAR(4000);
-- declare cursor for employee email
DEClARE curUsages
CURSOR FOR
SELECT associated_usages from usagesTbl where associated_usages not like '[]';
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
OPEN curUsages;
getUsages: LOOP
FETCH curUsages INTO usages;
IF finished = 1 THEN
LEAVE getUsages;
END IF;
WHILE i < JSON_LENGTH(usages) DO
INSERT INTO usagesTbl VALUES (JSON_EXTRACT(usages, CONCAT('$[',i,']')));
SET i = i + 1;
END WHILE;
SET i = 0;
END LOOP getUsages;
CLOSE curUsages;
END;
while 循环变量"i" 似乎没有增加,我一直卡在循环里。我这么想的原因是我把JSON_EXTRACT代码拿出来写了这个测试用:
set @i = 0;
select JSON_EXTRACT(associated_usages, CONCAT('$[',@i,']')) from usagesTbl where associated_usages not like '[]';
我可以将@i 的值更改为我想要的任何索引,并获得正确的数据。我只是坚持为什么它在存储过程中的 while 循环中不起作用。非常感谢任何帮助!
不确定这是否是问题所在,但我看到了:
DEClARE curUsages
应该是这样的:
DECLARE curUsages
会不会是简单的错别字? (1
为 L
)
已修复!它以某种方式创建了一个无限循环,即使存储过程说它已完成 运行,它也会继续插入数据。我删除并重新创建了 table,并将 usages 的数据类型从 VARCHAR 改回 json,它的效果非常好。
我有几列是 json 数组,它们具有这样的日期时间数据:
["2017-04-18 11:05:00.000000"]
["2017-04-20 11:05:00.000000"]
["2017-04-22 11:05:00.000000"]
["2017-12-11 22:14:02.000000", "2017-12-11 22:14:08.000000", "2017-12-11 22:19:13.000000", "2017-12-11 22:20:44.000000", "2017-12-11 22:21:54.000000", "2017-12-11 22:23:09.000000"]
["2017-12-13 13:21:04.000000"]
["2017-12-14 13:10:44.000000", "2017-12-14 13:21:51.000000"]
["2017-12-15 13:27:21.000000", "2017-12-15 13:30:21.000000"]
["2017-12-16 15:15:22.000000"]
目标是解析日期时间数据并将其存储到一个单独的 table 中,我计划从中做一些有趣的事情。目前,它只插入第一条记录,它插入了 ~180000 次。我当前的代码是:
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE i INTEGER DEFAULT 0;
DECLARE usages VARCHAR(4000);
-- declare cursor for employee email
DEClARE curUsages
CURSOR FOR
SELECT associated_usages from usagesTbl where associated_usages not like '[]';
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
OPEN curUsages;
getUsages: LOOP
FETCH curUsages INTO usages;
IF finished = 1 THEN
LEAVE getUsages;
END IF;
WHILE i < JSON_LENGTH(usages) DO
INSERT INTO usagesTbl VALUES (JSON_EXTRACT(usages, CONCAT('$[',i,']')));
SET i = i + 1;
END WHILE;
SET i = 0;
END LOOP getUsages;
CLOSE curUsages;
END;
while 循环变量"i" 似乎没有增加,我一直卡在循环里。我这么想的原因是我把JSON_EXTRACT代码拿出来写了这个测试用:
set @i = 0;
select JSON_EXTRACT(associated_usages, CONCAT('$[',@i,']')) from usagesTbl where associated_usages not like '[]';
我可以将@i 的值更改为我想要的任何索引,并获得正确的数据。我只是坚持为什么它在存储过程中的 while 循环中不起作用。非常感谢任何帮助!
不确定这是否是问题所在,但我看到了:
DEClARE curUsages
应该是这样的:
DECLARE curUsages
会不会是简单的错别字? (1
为 L
)
已修复!它以某种方式创建了一个无限循环,即使存储过程说它已完成 运行,它也会继续插入数据。我删除并重新创建了 table,并将 usages 的数据类型从 VARCHAR 改回 json,它的效果非常好。