use*_*894 1 java oracle pagination jdbc
我有一张包含数百万条记录的表格.为了使系统更快,我需要在我的Java代码中实现分页概念.我需要一次只获取1000条记录并处理它们,然后选择另外1000条记录并进行处理等等.我已经尝试了一些东西,但没有一个在起作用.我试过的一些事情如下 -
1) String query = "select * from TABLENAME" + " WHERE ROWNUM BETWEEN %d AND %d";
sql = String.format(query, firstrow, firstrow + rowcount);
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,当查询是SELECT * from TABLENAME Where ROWNUM BETWEEN 0 and 10它给我一个结果但是当查询是SELECT * from TABLENAME Where ROWNUM BETWEEN 10 and 20,它返回一个空的结果集.我甚至试图在DB中运行它,它返回Empty结果集(不知道为什么!!)
2)preparedStatement.setFetchSize(100);我在我的Java代码中有这个,但它仍然从表中获取所有记录.无论如何,添加此语句并不会影响我的代码.
请帮忙!
听起来您实际上并不需要对结果进行分页,而只是批量处理结果.如果是这种情况,那么您需要做的就是使用setFetchSize将获取大小设置为1000并像往常一样迭代结果集(使用resultset.next())并在迭代时处理结果.有许多资源描述了setFetchSize及其功能.做一些研究:
对于oracle分页,有很多资源描述了如何执行此操作.只需进行网络搜索.以下是一些描述如何执行此操作的资源:
如果您没有定义一致的排序(ORDER BY子句),则分页不是很有用,因为您不能依赖它们返回的顺序.
这个答案解释了为什么你的BETWEEN陈述不起作用:https://stackoverflow.com/a/10318244/908961
如果使用超过12c的oracle,您需要进行子选择以获得结果.就像是:
SELECT c.*
FROM (SELECT c.*, ROWNUM as rnum
FROM (SELECT * FROM TABLENAME ORDER BY id) c) c
WHERE c.rnum BETWEEN %d AND %d
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Oracle 12c或更高版本,我建议您使用较新的OFFSET FETCH语法而不是使用rownum.请参阅上面的第一个链接或
http://www.toadworld.com/platforms/oracle/b/weblog/archive/2016/01/23/oracle-12c-enhanced-syntax-for-row-limiting-aka-top-正查询
所以你的查询会是这样的
String query = "select * from TABLENAME OFFSET %d ROWS FETCH NEXT 1000 ONLY";
String.format(query, firstrow);
Run Code Online (Sandbox Code Playgroud)
或使用准备好的陈述
PreparedStatement statement = con.prepareStatement("select * from TABLENAME OFFSET ? ROWS FETCH NEXT 1000 ONLY");
statement.setInt(1, firstrow);
ResultSet rs = statement.executeQuery();
Run Code Online (Sandbox Code Playgroud)
或者您也可以使用此处所述的限制关键字http://docs.oracle.com/javadb/10.10.1.2/ref/rrefjdbclimit.html,您的查询将类似于
String query = "select * from TABLENAME { LIMIT 1000 OFFSET %d }";
String.format(query, firstrow);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4592 次 |
| 最近记录: |