2011-04-04 60 views
3

我在Oracle中发现了很多分页的例子。我正在使用的特定一个现在看起来是这样的:为任何查询实现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查询工具,它设法实现分页,即使在上面的查询失败时也能正常工作,当我将其包含在分页代码中时,分页失败。任何人都可以告诉我他们如何设法将其拉下来?

+1

你应该不正常 “'SELECT *'” 反正。枚举内部查询中的所有列以消除不明确性,从而使查询对模式更改具有弹性(例如,将列添加到表中时)。 – 2011-04-05 00:35:14

回答

7

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

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

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

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等

+1

这里的想法是不要通过操纵它来打破另外的有效查询。 Oracle/SQL允许用户选择冗余数据,所以我想要一个支持它的分页解决方案。 – 2011-04-06 02:43:19