与Oracle进行分页

我不像我想要的那样熟悉Oracle。 我有大约25万条logging,我想每页显示100条logging。 目前我有一个存储过程,它使用数据适配器,数据集和dataadapter.Fill(dataset)方法从存储过程的结果中检索所有25万logging到数据集。 如果我有“页码”和“每页logging数”作为整数值,我可以作为parameter passing,什么是最好的方式来找回那个特定的部分。 比如说,如果我通过10页作为页码,120页作为页数,从select语句中可以得到1880年到1200年之类的东西,那么我脑中的math可能就会消失。

我用C#在.NET中这样做,认为这并不重要,如果我可以在SQL方面得到它,那么我应该很酷。

更新:我能够使用布赖恩的build议,而且工作得很好。 我想进行一些优化,但是页面会在4到5秒内完成,而不是一分钟,而且我的分页控制能够很好地与新的存储过程集成在一起。

像这样的东西应该工作: 从Frans Bouma的博客

SELECT * FROM ( SELECT a.*, rownum r__ FROM ( SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%' ORDER BY OrderDate DESC, ShippingDate DESC ) a WHERE rownum < ((pageNumber * pageSize) + 1 ) ) WHERE r__ >= (((pageNumber-1) * pageSize) + 1) 

询问汤姆分页和非常有用的分析function。

这是摘自该页面:

 select * from ( select /*+ first_rows(25) */ object_id,object_name, row_number() over (order by object_id) rn from all_objects) where rn between :n and :m order by rn; 

为了完整性,对于寻求更现代的解决scheme的人来说,在Oracle 12c中有一些新的function,包括更好的分页和顶层处理。

分页

分页看起来像这样:

 SELECT * FROM user ORDER BY first_name OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; 

前N个logging

获取最高logging如下所示:

 SELECT * FROM user ORDER BY first_name FETCH FIRST 5 ROWS ONLY 

注意上面的查询例子都有ORDER BY子句。 新的命令尊重这些,并在sorting的数据上运行。

我找不到一个好的关于FETCHOFFSET Oracle参考页面,但是这个页面很好地概述了这些新function。

只是想总结一下答案和评论。 有很多方法可以做分页。

在oracle 12c之前,没有OFFSET / FETCHfunction,所以请看@jasonkbuild议的白皮书 。 这是我发现的关于不同方法的最全面的文章,详细解释了优缺点。 在这里复制粘贴需要很长时间,所以我不会这样做。

jooq的创build者也有一篇很好的文章解释了oracle和其他数据库分页的常见注意事项。 jooq的博文

好消息,既然oracle 12c我们有一个新的OFFSET / FETCHfunction。 OracleMagazine 12c的新function 。 请参阅“前N个查询和分页”

您可以通过发出以下语句来检查您的oracle版本

 SELECT * FROM V$VERSION 

尝试以下操作:

 SELECT * FROM (SELECT FIELDA, FIELDB, FIELDC, ROW_NUMBER() OVER (ORDER BY FIELDC) R FROM TABLE_NAME WHERE FIELDA = 10 ) WHERE R >= 10 AND R <= 15; 

通过[tecnicume]