错误 3141,SP 中函数 JSON_EXTRACT 的 JSON 文本参数 1 无效
Error 3141, invalid JSON text argument 1 to function JSON_EXTRACT within a SP
我一直在试图找出为什么 mysql 向我显示下一个错误。
CALL syncSAP_ncmCodes("[{\"AbsEntry\": 1,\"NcmCode\": \"01010101\",\"Descrip\": \"No existe en el catálogo\", \"GroupCode\": \"S\"}]") Error Code: 3141. Invalid JSON text in argument 1 to function json_extract: "The document root must not follow by other values." at position
当我这样调用的时候
CALL syncSAP_ncmCodes("[{\"AbsEntry\": 1,\"NcmCode\": \"01010101\",\"Descrip\": \"No existe en el catálogo\", \"GroupCode\":\"S\"}]");
这是SP
CREATE DEFINER=`admin`@`%` PROCEDURE `syncSAP_ncmCodes`(IN json_response mediumtext)
BEGIN
set @tot_elements = JSON_LENGTH(json_response);
set @cts = CURRENT_TIMESTAMP();
set @i = 0;
while @i < @tot_elements do
SET @ncmCode = json_response->"$[0]";
set @AbsEntry= ITEM_JSON(@ncmCode, '$.AbsEntry');
set @NcmCode= ITEM_JSON(@ncmCode, '$.NcmCode');
set @Descrip= ITEM_JSON(@ncmCode, '$.Descrip');
set @GroupCode= ITEM_JSON(@ncmCode, '$.GroupCode');
INSERT INTO `IK-Inventario`.`cat_sap_ncmCodes`
(
`AbsEntry`,`NcmCode`,
`Descrip`,`GroupCode`,
`ncmCodeSource`,
`enabled`,
`created_by`,`created_at`,`updated_at`,`updated_by`
)
VALUES
(
@AbsEntry,
@NcmCode,
@Descrip,
@GroupCode,
"SAP",
1,
"SYSTEM",@cts,@cts,"SYSTEM"
)
ON duplicate key update
`AbsEntry`= @AbsEntry,
`NcmCode`= @NcmCode,
`Descrip`= @Descrip,
`GroupCode`= @GroupCode,
`ncmCodeSource`="SAP",
`enabled`=1,
`updated_at`= @cts,
`updated_by`="SYSTEM";
set @i = @i +1;
end while;
select concat("RDS:syncncm_Codes:",@cts,": ",@i," records processed.") AS result;
END
这是table
CREATE TABLE `cat_sap_ncmCodes` (
`AbsEntry` int(11) NOT NULL,
`NcmCode` varchar(45) NOT NULL,
`Descrip` varchar(100) DEFAULT NULL,
`GroupCode` varchar(45) DEFAULT NULL,
`ncmCodeSource` varchar(45) DEFAULT NULL,
`created_by` varchar(45) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_by` varchar(45) DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`enabled` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`NcmCode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
这是ITEM_JSON函数
CREATE DEFINER=`admin`@`%` FUNCTION `ITEM_JSON`(jsonData TEXT, prop VARCHAR(100)) RETURNS text CHARSET utf8
BEGIN
DECLARE theValue TEXT;
#SELECT JSON_UNQUOTE(JSON_EXTRACT(jsonData, prop)) INTO theValue;
#RETURN theValue;
RETURN JSON_UNQUOTE(JSON_EXTRACT(jsonData, prop));
END
我已经尝试使用来自隔离 sql 脚本的具有相同参数的 JSON_EXTRACT 函数及其工作,但是当我尝试在 SP 中使用它时显示错误.
有人可以帮助我,告诉我在哪里可以搜索吗?
这是一个难以解决的问题。
这是从mysqlWorkbench复制出来的,如果您使用phpmyadmin或其他方式插入程序或函数,您可能需要DELIMITER
在开始和结束。
问题是你的文本是 latin1 而我的系统和 most other today 是 utf8。
所以你的代码无法处理你的西班牙语目录,所有的东西都运行很顺利,它可以识别json。
将输入参数改为latin1后可以正确找到文本
我还重写了您遍历 json 的所有元素的部分。
最后一个是过程调用,如您所见,您根本不需要 \"
CREATE DEFINER=`root`@`localhost` PROCEDURE `syncSAP_ncmCodes`(IN json_response mediumtext CHARSET latin1)
BEGIN
DECLARE _test mediumtext CHARSET latin1;
set @tot_elements = JSON_LENGTH(json_response);
set @cts = CURRENT_TIMESTAMP();
set @i = 0;
while @i < @tot_elements do
SELECT JSON_EXTRACT(json_response,CONCAT("$[",@i,"]")) INTO @NcmCode1;
set @AbsEntry= ITEM_JSON( @NcmCode1, '$.AbsEntry');
set @NcmCode= ITEM_JSON( @NcmCode1, '$.NcmCode');
set @Descrip= ITEM_JSON( @NcmCode1, '$.Descrip');
set @GroupCode= ITEM_JSON( @NcmCode1, '$.GroupCode');
INSERT INTO `cat_sap_ncmCodes`
(
`AbsEntry`,`NcmCode`,
`Descrip`,`GroupCode`,
`ncmCodeSource`,
`enabled`,
`created_by`,`created_at`,`updated_at`,`updated_by`
)
VALUES
(
@AbsEntry,
@NcmCode,
@Descrip,
@GroupCode,
"SAP",
1,
"SYSTEM",@cts,@cts,"SYSTEM"
)
ON duplicate key update
`AbsEntry`= @AbsEntry,
`NcmCode`= @NcmCode,
`Descrip`= @Descrip,
`GroupCode`= @GroupCode,
`ncmCodeSource`="SAP",
`enabled`=1,
`updated_at`= @cts,
`updated_by`="SYSTEM";
set @i = @i +1;
end while;
select concat("RDS:syncncm_Codes:",@cts,": ",@i," records processed.") AS result;
END
函数
CREATE DEFINER=`root`@`localhost` FUNCTION `ITEM_JSON`(jsonData TEXT CHARSET latin1, prop VARCHAR(100)) RETURNS text CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE theValue TEXT;
#SELECT JSON_UNQUOTE(JSON_EXTRACT(jsonData, prop)) INTO theValue;
#RETURN theValue;
RETURN JSON_UNQUOTE(JSON_EXTRACT(jsonData, prop));
RETURN 1;
END
最后是插入数据的调用
CAll syncSAP_ncmCodes('[{"AbsEntry": 1,"NcmCode": "01010101", "Descrip": "No existe en el catálogo", "GroupCode": "S"}]');
我在 windows 上的 msql 8.0.20 上的这个 运行s,可能是你必须改变一点或另一点,这取决于 os
# AbsEntry, NcmCode, Descrip, GroupCode, ncmCodeSource, created_by, created_at, updated_by, updated_at, enabled
1, 01010101, No existe en el catálogo, S, SAP, SYSTEM, 2020-06-06 18:30:50, SYSTEM, 2020-06-06 18:30:50, 1
我一直在试图找出为什么 mysql 向我显示下一个错误。
CALL syncSAP_ncmCodes("[{\"AbsEntry\": 1,\"NcmCode\": \"01010101\",\"Descrip\": \"No existe en el catálogo\", \"GroupCode\": \"S\"}]") Error Code: 3141. Invalid JSON text in argument 1 to function json_extract: "The document root must not follow by other values." at position
当我这样调用的时候
CALL syncSAP_ncmCodes("[{\"AbsEntry\": 1,\"NcmCode\": \"01010101\",\"Descrip\": \"No existe en el catálogo\", \"GroupCode\":\"S\"}]");
这是SP
CREATE DEFINER=`admin`@`%` PROCEDURE `syncSAP_ncmCodes`(IN json_response mediumtext)
BEGIN
set @tot_elements = JSON_LENGTH(json_response);
set @cts = CURRENT_TIMESTAMP();
set @i = 0;
while @i < @tot_elements do
SET @ncmCode = json_response->"$[0]";
set @AbsEntry= ITEM_JSON(@ncmCode, '$.AbsEntry');
set @NcmCode= ITEM_JSON(@ncmCode, '$.NcmCode');
set @Descrip= ITEM_JSON(@ncmCode, '$.Descrip');
set @GroupCode= ITEM_JSON(@ncmCode, '$.GroupCode');
INSERT INTO `IK-Inventario`.`cat_sap_ncmCodes`
(
`AbsEntry`,`NcmCode`,
`Descrip`,`GroupCode`,
`ncmCodeSource`,
`enabled`,
`created_by`,`created_at`,`updated_at`,`updated_by`
)
VALUES
(
@AbsEntry,
@NcmCode,
@Descrip,
@GroupCode,
"SAP",
1,
"SYSTEM",@cts,@cts,"SYSTEM"
)
ON duplicate key update
`AbsEntry`= @AbsEntry,
`NcmCode`= @NcmCode,
`Descrip`= @Descrip,
`GroupCode`= @GroupCode,
`ncmCodeSource`="SAP",
`enabled`=1,
`updated_at`= @cts,
`updated_by`="SYSTEM";
set @i = @i +1;
end while;
select concat("RDS:syncncm_Codes:",@cts,": ",@i," records processed.") AS result;
END
这是table
CREATE TABLE `cat_sap_ncmCodes` (
`AbsEntry` int(11) NOT NULL,
`NcmCode` varchar(45) NOT NULL,
`Descrip` varchar(100) DEFAULT NULL,
`GroupCode` varchar(45) DEFAULT NULL,
`ncmCodeSource` varchar(45) DEFAULT NULL,
`created_by` varchar(45) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_by` varchar(45) DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`enabled` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`NcmCode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
这是ITEM_JSON函数
CREATE DEFINER=`admin`@`%` FUNCTION `ITEM_JSON`(jsonData TEXT, prop VARCHAR(100)) RETURNS text CHARSET utf8
BEGIN
DECLARE theValue TEXT;
#SELECT JSON_UNQUOTE(JSON_EXTRACT(jsonData, prop)) INTO theValue;
#RETURN theValue;
RETURN JSON_UNQUOTE(JSON_EXTRACT(jsonData, prop));
END
我已经尝试使用来自隔离 sql 脚本的具有相同参数的 JSON_EXTRACT 函数及其工作,但是当我尝试在 SP 中使用它时显示错误.
有人可以帮助我,告诉我在哪里可以搜索吗?
这是一个难以解决的问题。
这是从mysqlWorkbench复制出来的,如果您使用phpmyadmin或其他方式插入程序或函数,您可能需要DELIMITER
在开始和结束。
问题是你的文本是 latin1 而我的系统和 most other today 是 utf8。
所以你的代码无法处理你的西班牙语目录,所有的东西都运行很顺利,它可以识别json。
将输入参数改为latin1后可以正确找到文本
我还重写了您遍历 json 的所有元素的部分。
最后一个是过程调用,如您所见,您根本不需要 \"
CREATE DEFINER=`root`@`localhost` PROCEDURE `syncSAP_ncmCodes`(IN json_response mediumtext CHARSET latin1)
BEGIN
DECLARE _test mediumtext CHARSET latin1;
set @tot_elements = JSON_LENGTH(json_response);
set @cts = CURRENT_TIMESTAMP();
set @i = 0;
while @i < @tot_elements do
SELECT JSON_EXTRACT(json_response,CONCAT("$[",@i,"]")) INTO @NcmCode1;
set @AbsEntry= ITEM_JSON( @NcmCode1, '$.AbsEntry');
set @NcmCode= ITEM_JSON( @NcmCode1, '$.NcmCode');
set @Descrip= ITEM_JSON( @NcmCode1, '$.Descrip');
set @GroupCode= ITEM_JSON( @NcmCode1, '$.GroupCode');
INSERT INTO `cat_sap_ncmCodes`
(
`AbsEntry`,`NcmCode`,
`Descrip`,`GroupCode`,
`ncmCodeSource`,
`enabled`,
`created_by`,`created_at`,`updated_at`,`updated_by`
)
VALUES
(
@AbsEntry,
@NcmCode,
@Descrip,
@GroupCode,
"SAP",
1,
"SYSTEM",@cts,@cts,"SYSTEM"
)
ON duplicate key update
`AbsEntry`= @AbsEntry,
`NcmCode`= @NcmCode,
`Descrip`= @Descrip,
`GroupCode`= @GroupCode,
`ncmCodeSource`="SAP",
`enabled`=1,
`updated_at`= @cts,
`updated_by`="SYSTEM";
set @i = @i +1;
end while;
select concat("RDS:syncncm_Codes:",@cts,": ",@i," records processed.") AS result;
END
函数
CREATE DEFINER=`root`@`localhost` FUNCTION `ITEM_JSON`(jsonData TEXT CHARSET latin1, prop VARCHAR(100)) RETURNS text CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE theValue TEXT;
#SELECT JSON_UNQUOTE(JSON_EXTRACT(jsonData, prop)) INTO theValue;
#RETURN theValue;
RETURN JSON_UNQUOTE(JSON_EXTRACT(jsonData, prop));
RETURN 1;
END
最后是插入数据的调用
CAll syncSAP_ncmCodes('[{"AbsEntry": 1,"NcmCode": "01010101", "Descrip": "No existe en el catálogo", "GroupCode": "S"}]');
我在 windows 上的 msql 8.0.20 上的这个 运行s,可能是你必须改变一点或另一点,这取决于 os
# AbsEntry, NcmCode, Descrip, GroupCode, ncmCodeSource, created_by, created_at, updated_by, updated_at, enabled
1, 01010101, No existe en el catálogo, S, SAP, SYSTEM, 2020-06-06 18:30:50, SYSTEM, 2020-06-06 18:30:50, 1