【问题标题】:Oracle "order by" clause returning results in wrong order or with results missingOracle“order by”子句以错误的顺序返回结果或结果丢失
【发布时间】:2013-10-31 05:20:39
【问题描述】:

在我的应用程序日志中,我可以看到查询结果正在被迭代(使用 JDBC ResultSet,没什么特别的),并且实际在表中的某些结果要么丢失,要么在结果集中出现得太晚(我不确定是哪个,因为如果发生这种情况,我经常会在结束之前遇到主键违规)。

我的查询是:

select t.* from myschema.vm t order by id;

但是当我在 SQL Developer 中运行完全相同的查询时,我看不到这个问题发生(当数据库没有改变时),它只在我的应用程序中出现大约一半的时间(我怀疑由于所有插入和更新导致表发生变化,因此有时不会发生这种情况。

其他要提的关键点:

  1. 我正在使用另一个数据库连接进行更新、插入和可能删除,同时我正在迭代 ResultSet。不过,这应该没关系吧?
  2. 我正在使用 BoneCP 进行连接池。
  3. 数据库编码为 AL32UTF8。

为什么会这样?快把我逼疯了!

【问题讨论】:

  • id 列的数据类型是什么?
  • @a_horse_with_no_name varchar2(64)
  • 您是否为resultSetTyperesultSetConcurrency 指定了任何内容?
  • @Colin'tHart 是的,现在是ResultSet.TYPE_FORWARD_ONLYResultSet.CONCUR_READ_ONLY。在我之前与此问题相关的 StackOverflow 问题中,它有所不同,但它现在正在使用这些。
  • 我怀疑您实际上是在该字符列中存储数字,现在您对 '10' 出现在 '2' 之前感到惊讶。这是因为您以错误的方式存储数字。您应该将它们存储在NUMBER 列中,然后排序将正确。

标签: sql oracle jdbc oracle11g


【解决方案1】:

这个问题是由于用户错误造成的。我在另一台机器上运行了该应用程序的另一个副本,但我忘记了它,它同时更改了数据库。

【讨论】:

    【解决方案2】:

    Oracle 结果集在您执行查询的那一刻被冻结,无论您如何稍后获取数据(或其中的一部分);因此,如果其他会话插入数据,您会发现(正确排序)只有在您打开游标时已经提交的行。

    另外,我怀疑您创建 ID 时对表上找到的当前值进行了一些评估,而不是使用序列或共享原子计数器,因此您会遇到 PK 违规。

    【讨论】:

    • 不,我不创建 ID,这些不是生成的密钥,它们是现实中已经存在的主机名。
    • 这并不能解释问题:这些是在迭代之前、之后和期间连续存在的结果。
    • 您写道“我正在使用另一个数据库连接进行更新、插入和可能删除,同时我正在迭代 ResultSet。”关键是:当您打开光标时,您确定“丢失”的结果真的存在吗?你如何断言它们应该在那里?
    • 是的,我确定。我正在使用 JDBC 驱动程序自己的日志记录机制记录所有内容。
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多