调用MySQL存储过程传入JSON字符串触发语法错误求助
解决MySQL存储过程
createRequisition的JSON参数语法错误问题 问题根源
从报错信息一眼就能定位问题:你传入的locationsString参数里的JSON内容没有正确处理,MySQL解析SQL语句时,把JSON里的双引号"当成了字符串的结束标记,直接打乱了整个INSERT语句的语法结构。
看你传入的locationsString片段:
(reqId,137,137,137,2,2,2,493,{"billToId":137,"shipToId":137,...})
这里最后一个字段是JSON对象,但完全没有用单引号包裹,MySQL根本没法识别这是一个完整的字符串值,自然会抛出语法错误。
解决方案
你需要修改调用参数中的locationsString,把JSON对象用单引号括起来,确保MySQL能正确识别它是一个字符串类型的字段值。因为整个locationsString是用单引号作为外层包裹的,所以内部包裹JSON的单引号需要用反斜杠\转义。
修改后的完整调用示例:
call createRequisition( 5, null, '(reqId,137,137,137,2,2,2,493,\'{"billToId":137,"shipToId":137,"loadingId":137,"loadingLocationId":2,"billToLocationId":2,"shipToLocationId":2,"skuId":493,"skuWeight":30,"loadingbranchName":"New Branch ","loadingCompanyName":"Teja & Teja Pvt. Ltd","loadingErpCode":"WERT","loadingShortName":"Kolkata","loadingLongName":"West Bengal, India","shipToCompanyName":"Teja & Teja Pvt. Ltd","shipTobranchName":"New Branch ","shipToErpCode":"WERT","shipToShortName":"Kolkata","shipToLongName":"West Bengal, India","billToBranchName":"New Branch ","billToCompanyName":"Teja & Teja Pvt. Ltd","billToErpCode":"WERT","billToShortName":"Kolkata","billToLongName":"West Bengal, India","skuQuantity":10}\')', 10, null, '2019-10-18', '111', 'Just Do It', '17', 2, 'Open Daala zzz', 1, 'HIGH', null );
额外安全提醒
你的存储过程用了动态SQL拼接生成INSERT语句,这种写法存在SQL注入风险。建议要么在传入locationsString前做严格的内容校验和转义,要么改用参数化查询的方式替代动态拼接,避免恶意输入破坏业务逻辑或泄露数据。
比如可以在存储过程里先对JSON内容做转义处理:
-- 转义JSON里的双引号,避免打乱SQL语法 set locationsString = replace(locationsString, '"', '\\"');
内容的提问来源于stack exchange,提问作者user12188450
相关产品推荐
相关产品推荐

