网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  实例讲解如何实现某种类型的分页功能     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:76次  录入:管理员--2008-03-05  
 

在实际的工作和学习中中,在我们构建自定义搜索引擎的时候经常遇到的一个问题就是实现某种类型的分页功能,这也就是说,允许用户提交一个返回很多行数据的查询,并且只显示前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子句被满足时返回记录给下一部分的查询。

 
 
上一篇: 使用新的optimizer hints控制优化行为 (1)    下一篇: 实例讲解oracle监听口令及监听器安全
  相关文档
详细讲解各种数据库使用jdbc连接的方式 03-28
数据库管理员日常工作中必备的sql列表 (1) 05-05
oracle数据库decode()函数的使用方法 04-15
修改默认的oracle xml database监听端口 05-12
解析:ORACLE性能调整--统计信息的迁移 08-05
实例解析:数据库应用程序利用外部文件 09-01
实例讲解如何实现某种类型的分页功能 03-05
讲解oracle数据库ora-00257故障的解决过程 (1) 07-15
用一个实例讲解oracle数据库的pl/sql语句块 07-30
两种方法分析每月工作日计算程序 06-10
Oracle 8 资料库函式库 01-15
oracle数据库中如何对时间格式进行处理 03-19
修改表空间的SQL代码 01-15
未来的数据库将构筑在网格计算的环境之上 02-18
快速掌握解决ora-00844错误的实用方法 03-07
解析:Oracle9i到10g空闲等待事件的变化 09-01
oracle数据库中使用rman建立data guard (1) 05-14
在linux平台用hugetlbfs模拟lock_sga 05-13
理解物化视图刷新过程中出现的约束冲突 06-10
轻松掌握Oracle中事务管理的概念 09-29
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息