【问题标题】:How to fetch data from oracle in batches from java in equal batches如何从java中分批从oracle中获取数据
【发布时间】:2018-05-28 17:14:53
【问题描述】:

我有一张桌子 -

emp_record

有 40,000 条记录 我想从 java 代码中获取记录,下面是要求 -

  1. 一次只能返回 1000 条记录
  2. 在下一个命中接下来的 1000 条记录
  3. 继续直到所有记录用完
  4. SQL 查询不应嵌套,如

 select *
 from(
 SELECT a.*,rownum rn 
 FROM distributor  a)
 WHERE rn  >= 3000 and rn < 4000; 

非常感谢任何形式的帮助。

【问题讨论】:

    标签: java sql oracle


    【解决方案1】:

    这听起来很不自然,因为 40.000 条记录不算什么。我只会在一个查询中阅读它们,也许会分批分发它们。在这种情况下,您可以使用statement.setFetchSize(1000) 使 JDBC 驱动程序一次获取 1000 条记录并将其定位为解决需求。

    或者,如果您使用的是 Oracle 12,您可以使用:

    select * from distributor
    order by something_unique
    offset x rows fetch next 1000 rows only
    

    其中 x 是起始位置。它与 rownum 结构做同样的事情,但语法更好。

    【讨论】:

    • 可能是拼写错误或可见性问题,但我提到的是 40,000 条记录而不是 40.000 条。而表中的记录可以超过这个。顺便说一句,感谢您的回答。
    • 我尝试执行但得到错误 - ORA-00933: SQL 命令未正确结束 00933. 00000 - “SQL 命令未正确结束” *原因:*操作:第 3 行错误: 1 QUERY - "select * from distribution order by DISTRIBUTOR_ID offset 10 rows fetch next 1000 rows only" 在 Oracle SQL Developer(4.0.0.13) 上运行查询
    • 无论使用千位分隔符,四万条记录都不算多。您确定您使用的是 Oracle 12(从 v$version 中选择 *)吗? 11g 或更早版本不支持此功能。
    • 我的错,错过了查询的 oracle 12 先决条件。我的是“Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production” 我可以运行查询“select * from v$version;”适当地。请问还有什么解决办法吗?
    • 有几种方法可以使用内联视图(嵌套 SQL)来实现,但由于您不想使用它,所以我没有想法。也许您可以在一次选择中获取所有 40000 个 id(认为 id 小于完整记录),然后使用在 (id1, id2, ..., id1000) 中使用的选择一次获取 1000 个?
    【解决方案2】:

    您可以使用使用ROWNUM 的查询,首先按主键/唯一键对行进行排序。从这里查询的想法:Best practice for pagination in Oracle?

    SELECT * 
      FROM (SELECT A.*, rownum rn
              FROM (SELECT *
                      FROM emp_record
                     ORDER BY pri_key_col) A
             WHERE rownum <= :n * 1000)
     WHERE rn > (:n - 1) * 1000;
    
    • pri_key_col :表的主键/唯一键列。
    • n :表示批次的数字。如果 n = 1,则返回前 1000 以这种方式排序的记录,n=2 给出下一个 1000,依此类推。

    【讨论】:

    • 如果行数在您的 40.000 范围内,此答案有效并且运行正常。但请注意,一旦达到一百万行左右,它就不会扩展。然后,您需要对每个批次进行完整的索引扫描,这很痛苦。我在 2.3 mio 行的表上对其进行了测试。第一个块需要 0.9 秒,第 100 个 1.3 秒,第 1000 个已经 4.0 秒,最后一个 7.6 秒。
    • 嗯,它打破了“SQL查询不应该嵌套”,并且与问题中的查询非常相似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多