You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:33:22