我在 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 查询工具,它设法实现了分页,即使上面的查询在我将其包装在分页代码中时也会失败。谁能告诉我他们是如何做到的?
最佳答案
首先,原始查询需要有一个 ORDER BY 子句才能使分页解决方案合理地工作。否则,Oracle 为第一页、第二页和第 N 页返回相同的 500 行将是完全有效的。
SQL Developer 不会更改您的查询以实现分页。它只是将完整的查询发送到 Oracle 并使用 JDBC 本身对结果进行分页。 JDBC 客户端应用程序可以指定 fetch size它控制一次从数据库向客户端返回多少行。然后,客户端应用程序可以等待用户决定转到下一页或执行其他操作,在这种情况下,光标将关闭。
SQL Developer 方法是否有意义在很大程度上取决于您的应用程序的体系结构。如果您尝试在无状态 Web 应用程序中分页数据,它可能不起作用,因为您不会在多个页面请求中保持数据库 session 打开。另一方面,如果您有一个带有专用 Oracle 数据库连接的胖客户端应用程序,这是很合理的。
关于database - 为任何查询实现 Oracle 分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5541455/