为任何查询实施Oracle分页?

时间:2011-04-04 16:29:39

标签: database oracle pagination paging

我在Oracle中发现了很多分页示例。我现在使用的特定内容看起来像这样:

SELECT * FROM (
  SELECT a.*, ROWNUM RNUM FROM (
    **Select * From SomeTable**) a 
  WHERE ROWNUM <= 500) b 
WHERE b.RNUM >= 1

粗体的行代表“原始”查询。 SQL的其余部分是实现分页。我遇到的问题是一个完全有效的查询;将它放在我的分页代码中时会失败。

作为示例 - 此查询将失败:

SELECT TABLE1.*, TABLE1.SomeValue FROM TABLE1

列错误。但是,没有我的额外代码;它运行得很好。我有大量“已保存”的查询,但我必须确保我的分页解决方案不会使它们失效。

我已经使用SQL Developer作为我的Oracle查询工具,它设法实现分页,即使上面的查询在我将其包装在分页代码中时失败也能正常工作。任何人都可以告诉我他们是如何实现这一目标的吗?

2 个答案:

答案 0 :(得分:7)

首先,原始查询需要有一个ORDER BY子句才能使分页解决方案合理地工作。否则,Oracle为第一页,第二页和第N页返回相同的500行是完全有效的。

SQL Developer不会更改您的查询以实现分页。它只是将完整查询发送到Oracle并使用JDBC对结果进行分页。 JDBC客户端应用程序可以指定fetch size,它控制一次从数据库返回到客户端的行数。然后,客户端应用程序可以等待用户决定转到下一页或执行其他操作,在这种情况下光标将关闭。

SQL Developer方法是否有意义在很大程度上取决于应用程序的体系结构。如果您尝试在无状态Web应用程序中分页数据,它可能不起作用,因为您不会在多个页面请求中保持数据库会话打开。另一方面,如果你有一个带有专用Oracle数据库连接的胖客户端应用程序,这是非常合理的。

答案 1 :(得分:0)

首先, 做什么是

SELECT TABLE1.*, TABLE1.someValue from TABLE1

不会TABLE1。*自动选择“someValue”,那么为什么要冗余地查询呢?

其次,对于分页,请尝试分析查询方法

SELECT * FROM {
    SELECT col1, col2, col3
    , row_number() OVER (order by col1) position
    FROM TABLE1
} WHERE rn >= p_seek and rn < (p_seek+p_count)

p_seek是起始位置,p_count是要获取的行数。

这里代替col1,col2,col3等你可以做TABLE1。*,TABLE1.someValue等。