网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.名字中包含了什么?:改善的表空.
.FreeBSD-5.2下安装ORACLE9i手记.
.PL/SQL的异常.
.如何在Windows 2000下彻底删除Or.
.WIN平台下仅开一个端口让Oracle穿.
.为 PL/SQL 构建代码分析实用工具.
.用Linux+IPChains代替Windows+.
.数据库人员手册之Oracle初始化参.
.如何更改数据库的SCN?.
.Oracle自定义函数——f_henry_Ge.
.Oracle电子商务套件11i10首次亮相.
.Oracle字符值的比较和储存.
.TUX 2.0使用手册--一、什么是TUX.
.oracle中Decode()函数使用技巧的.
.ORA-03113错误分析与解决.
.主外键约束信息.
.oracle数据库java接口类.
.诊断Oracle数据库Hanging问题.
.10gRAC系列之10gRAC的网络设置.
.关于Oracle几种锁管理的汇总.

在Oracle中实现搜索分页查询

发表日期:2007-1-31


在构建自定义搜索引擎时,开发人员常遇到的一个问题是实现某种类型的分页功能;也就是说,允许用户提交一个返回很多行数据的查询,但是只显示前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 子句被满足时返回记录给下一部分查询。
http://blog.csdn.net/qiaodajun/archive/2007/01/30/1498010.aspx

上一篇:建立与Oracle数据库服务器连接的两种连接模式(专用服务器与共享服务器) 人气:3515
下一篇:SQLServer和Oracle的常用函数对比 人气:3355
浏览全部Oracle的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐