MyJsonArray
[{"ID":"D29","PersonID":"23616639"},{"ID":"D30","PersonID":"22629626"}]
и я хочу из sql. Задайте этот массив в моей таблице, но верните нулевое значение в переменной и не установили запись в моей базе данных. Моя функция:
DELIMITER $$
CREATE DEFINER='toshiari'@'localhost' FUNCTION 'setTitleRecords'('Title' VARCHAR(166) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 'List' JSON) RETURNS int(4)
BEGIN
DECLARE Item INT;
DECLARE HolderLENGTH INT;
DECLARE ValidJson INT;
DECLARE ID VARCHAR(166);
DECLARE PersonID VARCHAR(166);
DECLARE S1 VARCHAR(166);
DECLARE S2 VARCHAR(166);
SET ValidJson = (SELECT JSON_VALID(List));
IF ValidJson = 1 THEN
SET HolderLENGTH = (SELECT JSON_LENGTH(List));
SET Item = 0;
WHILE Item < HolderLENGTH DO
SET S1 = CONCAT("'$[",Item, "].ID'");
SET S2 = CONCAT("'$[",Item, "].PersonID'");
SET ID = (SELECT JSON_EXTRACT(List,S1));
SET PersonID = (SELECT JSON_EXTRACT(List,S2));
INSERT INTO 'Titles'('ID','PersonID','Title') VALUES (ID, PersonID, Title);
SET Item = Item + 1;
END WHILE;
RETURN 3;
ELSE
RETURN 2;
END IF;
END$$
DELIMITER ;
когда я использую эту команду в командах Sql без проблем и возвращаю истинное значение
SELECT JSON_EXTRACT('[{"ID":"D29","PersonID":"23616639"},{"ID":"D30","PersonID":"22629626"}]','$[0].ID') return "D29"
return "D29", но при запуске функции из этой ошибки возврата кода и сказал:
SET @p0='DR'; SET @p1='[{\"ID\":\"D29\",\"PersonID\":\"23616639\"},{\"ID\":\"D30\",\"PersonID\":\"22629626\"}]'; SELECT 'setTitleRecords'(@p0, @p1) AS 'setTitleRecords';
#4042 - Syntax error in JSON path in argument 2 to function 'json_extract' at position 1
Я создал небольшой тест, чтобы воспроизвести ваши проблемы. В основном вам просто нужно обновить S1 и S2 следующим образом:
SET S1 = CONCAT('$[',Item,'].ID');
SET S2 = CONCAT('$[',Item,'].PersonID');
И это так. Вы можете проверить тест в следующем URL-адресе: https://www.db-fiddle.com/f/2TPgF868snjwcHN3uwoSEA/0
DECLARE ID VARCHAR(100); DECLARE PersonID VARCHAR(100);