gpt4 book ai didi

mysql错误1064存储过程将json值提取到表中的特定列中

转载 作者:可可西里 更新时间:2023-11-01 08:38:55 31 4
gpt4 key购买 nike

我想将可变长度的json数据提取到现有表中,但出现以下错误:

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 'begin declare len int; declare i int; declare mykey varchar(60); declare myvalue' at line 2

有谁知道如何解决这个错误或如何将可变长度的 json 数据提取到现有表中?

这是我的代码:

drop procedure if exists wk; 
delimiter // 
create procedure wk(tb varchar(60), myjson json)   
begin
SET @LEN= (select JSON_LENGTH(myjson));
set @i=1;
set @mykey='initial';
set @myvalue='initial';
set @thekeys= (select JSON_keys(myjson));
set @mysql_1=concat("insert into ",tb," (");
set @mysql_2='(';
while @i < @len*2 do
select 3;
set @mykey = (select substring(substring_index(@thekeys,'"',@i+1),length(substring_index(@thekeys,'"',@i))+2));
set @myvalue = (select json_extract(myjson,concat('$.',@mykey)));
set @mysql_1= concat(@mysql, @mykey,",");
set @mysql_2= concat(@mysql_2, @myvalue,",") ;
set @i =@i+2
end while;

set @mysql = concat(substring(@mysql_1,-1),") values ", substring(@mysql_2,-1)," );");

PREPARE stmt FROM @mysql;
EXECUTE stmt;

end
//
delimiter ;

call wk('actor','{"actor_id": 1, "first_name": "NICK"}');

最佳答案

错误的直接原因似乎是程序第二行和第三行的一些非打印字符 - 直接在 delimiter// 之后,也在 的右括号之后创建过程 wk(tb varchar(60), myjson json)

一旦你清除了这些字符,你会得到另一个错误,它会告诉你紧接在 end while 之前有另一个语法错误(在 set @i =@i+ 之后缺少分号2).

MySQL 通常非常擅长让您准确地知道它在尝试解析您的语句时开始遇到问题的确切位置,问题直接出现在突出显示的文本之前。在这里,它表示问题从“开始”开始,问题就在它之前。

排除错误后,您的过程将运行并输出“3”两次。但是,@mysql 将为 NULL,并且不会准备和执行任何语句。

我不会尝试调试代码,因为我认为您使问题过于复杂了。当 MySQL 有非常好的工具可以为您完成这件事时,您似乎正在尝试编写自己的例程来解析部分 JSON。设置 @mykey 就是一个很好的例子,您可以在 @thekeys 数组中直接使用索引,而不是使用子字符串来解析键,例如

mysql> SET @thekeys = JSON_KEYS('{"actor_id": 1, "first_name": "NICK"}');

mysql> SET @mykey = JSON_UNQUOTE(JSON_EXTRACT(@thekeys, '$[1]'));

mysql> SELECT @mykey;
+------------+
| @mykey |
+------------+
| first_name |
+------------+

如果使用内置的 JSON 函数可以使代码更简单,那么您只需担心您的键值对是否与定义的列名和数据类型匹配。

例如

DELIMITER //

DROP PROCEDURE IF EXISTS wk //
CREATE PROCEDURE wk(tbl VARCHAR(64), myjson JSON)
BEGIN
DECLARE i INT DEFAULT 0;
SET @keys = '';
SET @vals = '';

WHILE i < JSON_LENGTH(myjson) DO
SET @mykey = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(myjson), CONCAT('$[', i, ']')));
SET @myval = JSON_UNQUOTE(JSON_EXTRACT(myjson, CONCAT('$.', @mykey)));

SET @keys = CONCAT(@keys, IF(CHAR_LENGTH(@keys) > 0, ',', ''),
CONCAT('`', @mykey, '`'));
SET @vals = CONCAT(@vals, IF(CHAR_LENGTH(@vals) > 0, ',', ''),
CONCAT('''', @myval, ''''));
SET i = i + 1;
END WHILE;

SET @sql = CONCAT('INSERT INTO `', tbl , '`(', @keys, ') VALUES (', @vals, ');');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END //
DELIMITER ;

CALL wk('actor','{"actor_id": 1, "first_name": "NICK"}');

关于mysql错误1064存储过程将json值提取到表中的特定列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50230271/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com