Oracle 21数据库执行带<>条件的SELECT查询返回错误结果
Oracle查询结果异常问题
在Oracle数据库执行查询时出现结果异常,疑似数据缓存导致结果不正确。修改WHERE子句相关条件(尤其是不等于条件)后,结果恢复正常。该问题存在于多个查询中,首次出现于高执行次数的查询。
异常查询示例
SELECT TB_MODEL.ID FROM TB_MODEL WHERE TB_MODEL.SUBJECT = ? AND TB_MODEL.STATUS <> ? AND TB_MODEL.PARENT_ID IS NOT NULL
结果:返回空集(已确认数据库中存在符合该条件的数据)
有时重启Oracle数据库可解决问题,但并非每次都有效。
环境信息:
- Oracle RAC版本:21.3.0.0.0
- JDBC驱动版本:23.3.0.23.09
更新1:代码验证对比
以下代码执行后返回0:
String query = "SELECT TB_MODEL.ID FROM TB_MODEL WHERE TB_MODEL.SUBJECT = ? AND TB_MODEL.STATUS <> ? AND TB_MODEL.PARENT_ID IS NOT NULL"; Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//192.168.1.10:1521/dbk", "dbk", "dbk"); PreparedStatement statement = connection.prepareStatement(query); statement.setByte(1, (byte) 3); statement.setByte(2, (byte) 5); ResultSet resultSet = statement.executeQuery(); int count = 0; while (resultSet.next()) { count++; } return count;
将不等于条件的绑定变量替换为固定值后,代码返回313:
String query = "SELECT TB_MODEL.ID FROM TB_MODEL WHERE TB_MODEL.SUBJECT = ? AND TB_MODEL.STATUS <> 5 AND TB_MODEL.PARENT_ID IS NOT NULL"; Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//192.168.1.10:1521/dbk", "dbk", "dbk"); PreparedStatement statement = connection.prepareStatement(query); statement.setByte(1, (byte) 3); ResultSet resultSet = statement.executeQuery(); int count = 0; while (resultSet.next()) { count++; } return count;
更新2:问题特征总结
- 仅出现在包含不等于条件(`<>)的查询中
- 将不等于条件中的绑定变量(
?)替换为固定值可解决问题
内容的提问来源于stack exchange,提问作者Rajin
相关产品推荐
相关产品推荐

