JDBC读取Oracle NUMBER(1)布尔值时BigDecimal与1对比不相等问题
问题原因排查方向
- 最核心的常见原因:你在SQLPlus中执行的是带
WHERE DONE = 1过滤的查询,而Java代码里执行的是不带过滤条件的全表查询。如果你命中断点的记录DONE字段实际存储值不是1,自然会触发该判断为真。哪怕你之前在SQLPlus中查到过这条记录符合DONE=1的条件,也可能是以下可见性问题导致:- 两个操作使用的是不同的数据库会话,你对
DONE字段的更新操作在SQL*Plus会话中未提交,Java连接的会话根据Oracle的读一致性机制,看不到未提交的修改 - 你在SQL*Plus查询后,有其他会话更新了这条记录的
DONE字段值并提交,Java查询时取到的是更新后的值
- 两个操作使用的是不同的数据库会话,你对
- 表指向不一致问题:如果Java代码连接的数据库用户和SQL*Plus登录的用户不是同一个,且当前Java用户的schema下存在同名的
PROCESSED_RECORDS_EWS_BACKOUT表,你实际查询的不是同一张表,数据自然存在差异 - 数据类型兼容问题:Oracle的
NUMBER(1)类型支持存储-9到9之间的整数,如果你使用的JDBC驱动版本与Oracle 11.2不兼容,可能会出现类型转换异常,导致读取到的数值和实际存储值不符 - 建议调试时先查看断点处
doneBD的实际取值,可快速定位是数据取值问题还是逻辑判断问题
内容的提问来源于stack exchange,提问作者Alan Feldstein
相关产品推荐
相关产品推荐

