在Oracle db2 1中执行带有!=条件的选择查询时的错误结果

umuewwlo  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(166)

在Oracle中执行查询后,结果显示不正确。似乎有些数据被缓存,因此结果不正确。通过更改where子句中的某些条件(特别是与“不相等”相关的条件),结果将准确显示。这种情况在许多查询中都会发生,但第一次发生在具有高执行计数的Oracle中。
查询示例:

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;


此示例代码返回0:
而这一个返回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:

1.此问题发生在具有不等式条件(<>)的查询中
1.在不等式条件(TB_MODEL.STATUS <> ?-> TB_MODEL.STATUS <> 3)下,通过改变约束值(?)的固定值来解决该问题。

5tmbdcev

5tmbdcev1#

unCOMMIT ted数据只在创建它的会话中可见(如果它没有被COMMIT ted,则会在会话结束时显示ROLLBACK)。如果你不能从另一个会话中看到数据(即在C#中),请确保你已经在你INSERT ed数据的SQL客户端(即SQL Developer)中发出了COMMIT命令。

  • 注意事项:即使您以同一用户身份连接,这也将创建一个单独的会话,您将无法在另一个会话中看到未提交的数据。*

COMMIT文档:
直到你提交一个事务:

  • 您可以通过查询修改的表来查看在事务处理期间所做的任何更改,但其他用户无法看到这些更改。在您提交事务处理之后,这些更改对在提交之后执行的其他用户的语句可见。
  • 您可以使用ROLLBACK语句回滚(撤消)事务期间所做的任何更改(请参见ROLLBACK)。

因此,即使你说:
数据库中已存在数据。
如果它是在另一个会话中创建的,并且没有被COMMIT删除,这并不重要,因为它对任何其他会话都不可见。您需要确保COMMIT您的数据。

相关问题