sql常见报错问题集锦(持续更新)

611 阅读1分钟

汇总在工作中遇到的各种sql问题。

bad SQL Grammar:SQLexception is java.sql.SQLException: No value specified for parameter 3

问题描述

报错信息

 bad SQL grammar [ update station set reserve2 = ? ,status = ? , phone = (case when phone is null or phone = '' then ? else phone end)  , RESERVE4 = (case when RESERVE4 is null or RESERVE4 = '' then ? else RESERVE4 end)  where no = ? and code = ? and sta_code = ? and org_code = ? and ( status != 'finish' or status is null ) and create_time > ? ]; nested exception is java.sql.SQLException: No value specified for parameter 3

报错的代码:

 int digestUpdate = getJdbcTemplate().update(digestSql, new Object[] { id, status, phone, phoneLastPart,result[0], result[1], result[2], result[3]},query7Days);

原因分析

No value specified for parameter 3:有哪些原因导致此问题?

  • 占位符需要的字段与实际给出的字段个数不一致:比如占位符为5个,但是实际上只给了4个字段的值

  • bad SQL grammar:就往sql上面思考,无非就是sql相关。所以要往此处想。

也就是说中间的某个字段没有值导致。

其中报错指出的第3个参数,也不一定真的是第3个。所以需要认真排查。

此处不是我写的,而是别人改过之后没有测试就提交了。等交接给我时,查看提交记录发现此处问题点是新增了query7Days字段。再仔细看,发现此处写的有问题。

解决办法

query7Days 应该在{}之内。修改后的:

 int digestUpdate = getJdbcTemplate().update(digestSql, new Object[] { id, status, phone, phoneLastPart,result[0], result[1], result[2], result[3],query7Days)};

复盘

  • 细节问题可能会导致花费过多时间:一个标点符号不注意,可能会导致查找问题耗时耗力。所以在写完后,要验证问题。

  • 要多注意抛错的信息:好好检查抛错处的代码,看写的有什么问题。