database - 为任何查询实现 Oracle 分页?

标签 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 查询工具,它设法实现了分页,即使上面的查询在我将其包装在分页代码中时也会失败。谁能告诉我他们是如何做到的?

最佳答案

首先,原始查询需要有一个 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/

相关文章:

database - ZF2 Dafault 数据库 session 存储

database - 数据库规范化还有用吗?

sql - 按列和最大日期分组时如何选择单行?

java - 得到???使用 JDBC 从 dbms_output.get_lines 输出

mysql - 带分页的搜索结果

java - SeedStack 存储库中的分页

ruby-on-rails - 在 graphql 分页中找到名称 'Connection' 的重复类型定义

java - servlet 无法保存到数据库

MySQL INDEX 当前数据库表

oracle - PLS_INTEGER 什么时候对性能真正有益?