Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从java中分批从oracle获取数据_Java_Sql_Oracle - Fatal编程技术网

如何从java中分批从oracle获取数据

如何从java中分批从oracle获取数据,java,sql,oracle,Java,Sql,Oracle,我有一张桌子- emp_record 它有40000条记录 我想从java代码中获取记录,下面是要求- 一次只能返回1000条记录 在接下来的1000张唱片中 继续,直到所有记录都用完为止 SQL查询不应嵌套,如 非常感谢您的任何帮助。这听起来很假,因为40000张唱片算不了什么。我只需在一次查询中阅读它们,或许还可以分批分发。在这种情况下,您可以使用statement.setFetchSize1000使JDBC驱动程序一次获取1000条记录,并将其定位为解决需求 或者,如果您使用的是Orac

我有一张桌子-

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

一次只能返回1000条记录 在接下来的1000张唱片中 继续,直到所有记录都用完为止 SQL查询不应嵌套,如
非常感谢您的任何帮助。

这听起来很假,因为40000张唱片算不了什么。我只需在一次查询中阅读它们,或许还可以分批分发。在这种情况下,您可以使用statement.setFetchSize1000使JDBC驱动程序一次获取1000条记录,并将其定位为解决需求

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

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

其中x是起始位置。它的功能与rownum构造相同,但语法更好。

您可以使用使用rownum的查询,方法是首先按主键/唯一键对行进行排序。从这里的查询中可以看出:

pri_key_col:表的主键/唯一键列。 n:表示批次的编号。如果n=1,则返回第一个1000 按这种方式排序的记录,n=2表示下一个1000,以此类推。
如果行数在您的40.000范围内,则此答案有效且运行正常。但请注意,一旦达到一百万行左右,它将无法扩展。然后,您需要对每个批次进行完整的索引扫描,这会带来伤害。我在230万行的桌子上测试了它。第一个块需要0.9秒,第100个1.3秒,第1000个已经是4.0秒,最后一个7.6秒。好吧,它打破了SQL查询不应该嵌套,并且与问题中的查询非常相似。可能是打字错误或可见性问题,但我提到的是40000记录,而不是40000记录。表中的记录可以远远超过这个。顺便说一句,谢谢你的回答。我试图执行,但得到了错误-ORA-00933:SQL命令没有正确结束00933。00000-SQL命令未正确结束*原因:*操作:第3行错误:第1行查询-按经销商从经销商订单中选择*偏移量10行获取下一个1000行仅在Oracle SQL Developer4.0.0.1340000条记录上运行查询不算多,无论使用了多少分隔符。您确定您使用的是Oracle 12 select*from v$版本吗?这在11g或更旧版本上不受支持。我的错,错过了查询的oracle 12先决条件。我的是Oracle Database 11g Enterprise Edition 11.2.0.4.0版-64位生产版我能够运行查询select*from v$版本;正确地请问还有其他解决方案吗?有几种方法可以使用内嵌视图嵌套SQL来实现,但由于您不想使用这种方法,我已经没有主意了。也许您可以在一个select中获取所有40000个id,并认为这些id小于完整记录,然后使用id1、id2、…、id1000中使用的select一次获取1000个id?
select * from distributor
order by something_unique
offset x rows fetch next 1000 rows only
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;