在构建自定义搜索引擎时,开发人员常遇到的一个问题是实现某种类型的分页功能;也就是说,允许用户提交一个返回很多行数据的查询,但是只显示前20条。在用户点击一个链接时,下20条或者前20条数据会从数据库应用程序中取出。
数据库访问存在的一个问题是来自 Web 站点的请求是无状态的。在等待用户请求下一组数据时,让数据库维护一个游标的效率是非常低的。对 HTML 编写代码让游标位于客户端是可以做到的,但是游标是一个有限的资源,所以每次在页面装载完成时最好关闭游标。
Oracle 游标不支持通过行集(rowset)向后移动;但是用户总是会在浏览器中后退,或者不按顺序请求一个行集。显然,返回有限行数据就成了数据库服务器的责任。
伪列(pseudocolumn)ROWNUM 中包含有当前的行号。很多人在第一次试图返回表中中间某段记录子集时,都会发现下面这种方法行不通:
select * from all_objects where rownum between 30 and 49; |
这种写法之所以行不通,是因为 ROWNUM 列只有在记录被取出或过滤时才会应用到记录上。第一行在被取出时会被抛出,因为它的 ROWNUM 是1。然后,下一行被取出;它也会被抛出,因为它是新的“1”,以此类推,直到所有的行都被使用。这个查询不会返回任何记录。解决方法是在看到30到50之间的记录时必须先取出1到30行的记录:
select * from all_objects where rownum <= 49; |
然后,你可以将它作为一个子查询并过滤掉开始点之前的所有记录(注意我必须为“rownum”提供一个别名才能编译):
select * from (select rownumr,all_objects.* from all_objects where rownum <=
49) t
where t.r >= 30; |
为了保证它的效率,不妨对这个限制使用绑定变量。这将使用所有此类请求在字面上完全相同,从而消除了在每次请求不同的范围求时重新解析查询:
select * from (select rownumr,all_objects.* from all_objects where rownum <=
:min) t
where t.r >= :max; |
如果你使用的语言能够通过存储过程返回行集,那么数据库将自动在内部处理绑定变量。然后,应用程序代码就会只接收它请求的记录,而不必决定接收哪些记录。
create or replace procedure search(p_mininteger,p_maxinteger,p_rowset out
sys_refcursor)
is
begin
select cursor(*) into p_rowset
from (select rownumr,all_objects.* from all_objects where rownum <=
p_max) t
where t.r >= p_min;
end search;
/
show errors |
注意 ROWNUM 是在排序之后计算的,所以使用 ORDER BY 子句将得到新的记录顺序。然而,基于规则的优化器用 ROWNUM 来“短路”查询,并在 ROWNUM 子句被满足时返回记录给下一部分查询。
分享到:
相关推荐
在Oracle数据库中,实现搜索分页查询是一项常见的任务,特别是在构建高效的数据检索系统时。分页查询允许用户逐步浏览大量数据,而无需一次性加载所有结果,从而提高用户体验并减轻服务器负担。以下是如何在Oracle中...
综上所述,通过以上知识点的学习,我们不仅可以了解Oracle中分页查询的基本实现方法及其优化策略,还可以深入理解Oracle 9i新增的操作系统统计信息功能及其应用价值。这对于提升Oracle数据库的应用性能具有重要的...
在Oracle数据库中,分页查询是一项关键功能,尤其在构建高效的数据检索系统,如自定义搜索引擎时,确保用户能够分批浏览大量数据。由于Web应用的无状态特性,每个请求都是独立的,维持数据库游标以供后续请求是低效...
本项目提供的源代码正是针对这一需求,提供了在Java Web环境中利用Oracle数据库实现分页功能的解决方案。 首先,我们来理解一下分页的基本概念。分页是将数据库查询结果分成若干页展示,用户可以逐页浏览,而不是一...
在这个实例中,我们将会深入探讨这些技术如何协同工作,实现分页搜索功能和上传附件操作。 1. **Struts2**:Struts2是一个MVC(Model-View-Controller)框架,它简化了Java Web应用的开发。在本实例中,Struts2作为...
最后,`emp_search_constitute`这个文件名可能是关于员工搜索构成的示例或者代码,可能包含如何在Oracle数据库中进行复杂查询,包括分页查询的实例。通过分析和学习这样的实例,我们可以更好地理解和掌握Oracle...
通过以上存储过程的实现,我们可以在Oracle数据库中高效地执行分页查询和记录计数,同时支持灵活的搜索条件。这不仅提高了查询性能,还简化了前端页面的展示和导航逻辑,为用户提供更好的交互体验。在实际应用中,...
在Oracle数据库中,实现分页查询通常涉及到`ROWNUM`伪列或者`FETCH FIRST n ROWS ONLY`(Oracle 12c及以上版本)和`OFFSET m ROWS`子句。`ROWNUM`是在查询结果集中生成的一个序号,而`FETCH`和`OFFSET`则可以用于...
3. **SQL分页**:在SQL查询语句中,使用LIMIT和OFFSET关键字实现分页。例如,对于MySQL,SQL可能看起来像这样: ```sql SELECT * FROM table LIMIT :offset, :pageSize; ``` 对于Oracle等不支持LIMIT和OFFSET的...
在数据库查询中,分页是一项常见且重要的技术,它能够帮助我们高效地处理大量数据,尤其是在展示数据列表时,如用户界面的表格显示或搜索结果的分页展示。不同的数据库系统,如SQL Server、MySQL、Oracle,由于其...
在SQL查询中,可以使用`LIMIT`(MySQL)或`OFFSET`和`FETCH`(PostgreSQL, SQL Server)来实现分页。例如,`SELECT * FROM table LIMIT 10 OFFSET 20` 将返回第21到30条记录。这种方式简单有效,但当数据量很大时,`...
本教程将重点讲解如何使用SSH框架与Compass结合,实现在网站内的搜索分页功能。 首先,让我们深入了解SSH框架的每个组件: 1. **Struts2**:这是一个MVC(Model-View-Controller)架构的开源框架,用于控制应用...
本文主要探讨了 Oracle 数据库海量数据的查询优化研究,通过对 Oracle 数据库的分析,讨论了分页查询技术、SQL 语句优化、索引技术等查询优化方法,并对 Oracle 数据库的设计和实现进行了深入探析。 Oracle 数据库...
1. 数据库层面:很多数据库系统如MySQL、Oracle等提供了内置的分页查询功能,可以通过LIMIT(MySQL)或ROWNUM(Oracle)等关键字实现。 2. 应用程序层面:在Java中,可以自定义一个分页工具类,包含如分页参数...
通过上述介绍,我们可以了解到在MySQL、Oracle等数据库中实现条件查询的基本方法,并且掌握了如何利用Hibernate框架来进行分页查询,这对于开发高质量的Web应用程序非常有帮助。此外,理解这些概念有助于更好地设计...
尽管它没有实现分页,但对初学者来说,这样的项目仍是一个很好的实践平台,可以帮助他们理解Java Web开发的基本流程和Oracle数据库的使用。对于有经验的开发者来说,这个系统可以作为一个基础,进一步扩展和完善,...
在 Oracle 数据库中,子查询是一种用于实现复杂查询的语句,用于在 FROM 子句中嵌套查询。子查询可以用于实现各种复杂查询,包括关联查询、聚合查询和排序查询等。 在 Oracle 数据库中,ROWNUM 伪列用于实现数据的...
在网页前端实现多条件搜索与后台分页是Web开发中常见的功能需求,它涉及到用户界面交互、HTTP请求处理以及数据库查询优化等多个方面。本篇将详细介绍如何实现这一功能。 首先,前端多条件搜索通常是在HTML表单中...
- GridView控件:ASP.NET中的GridView控件可以方便地实现数据展示和分页。只需设置其`AllowPaging`属性为`true`,并配置`PageSize`属性指定每页显示的行数。GridView会自动处理分页逻辑,包括生成页码链接。 - ...
6. **注意兼容性**:不同的数据库系统可能有不同的分页语法,比如Oracle使用`ROWNUM`配合子查询,而PostgreSQL使用`LIMIT`和`OFFSET`。 在提供的`SQLQuery1.sql`文件中,可能包含了这样一个实现分页读取的存储过程...