错误 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