使用jdbcTemplate调用MySQL存储过程参数被识别为double报错原因
问题解答
根因说明
你遇到的报错本质不是int类型参数被识别为double,是参数传递逻辑错误触发了MySQL的隐式类型转换逻辑,具体原因如下:
- 存储过程要求3个入参,参数顺序为
(varchar类型的forma, int类型的ryear, int类型的rperiod),你调用时的SQL写为call send_mail.NotReporting(forma,?,?),第一个参数位直接写了forma且没有加单引号,会被MySQL识别为字段/标识符而不是字符串常量,后续你只传了2个int参数对应后面的2个占位符,整体参数匹配完全错位。 - 当MySQL解析语法错位的SQL时,会尝试把不匹配的内容做隐式类型转换,错位后的参数位置刚好对应需要数值类型的ryear、rperiod字段,MySQL做数值转换时默认优先用DOUBLE类型做判断,解析到错误的字符串内容(比如报错里的
,ryear,)转换失败就会抛出「不正确的DOUBLE值」的截断错误,和你传入的int参数本身无关。
修复方案
根据你的业务场景二选一即可:
- 如果forma参数需要动态传入:把第一个参数位也改为占位符,传参时按顺序传入3个参数
示例代码:public List notReporting(String forma, int ryear, int rperiod) { jdbcTemplate.update("call send_mail.NotReporting(?,?,?)", forma, ryear, rperiod); // 其余业务逻辑 } - 如果forma参数是固定常量:给SQL里的forma值加上单引号包裹,避免被MySQL识别为标识符
示例代码:public List notReporting(int ryear, int rperiod) { // 把'你的固定forma值'替换为实际的常量值即可 jdbcTemplate.update("call send_mail.NotReporting('你的固定forma值',?,?)", ryear, rperiod); // 其余业务逻辑 }
内容的提问来源于stack exchange,提问作者Leyla Aliyeva
相关产品推荐
相关产品推荐

