在Oracle中实现搜索分页查询

幸福的杯心

幸福的杯心

2016-02-19 21:13

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享在Oracle中实现搜索分页查询教程,希望对大家能有一点小小的帮助。

  在构建自定义搜索引擎时,开发人员常遇到的一个问题是实现某种类型的分页功能;也就是说,允许用户提交一个返回很多行数据的查询,但是只显示前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;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  /

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  show errors

  注意 ROWNUM 是在排序之后计算的,所以使用 ORDER BY 子句将得到新的记录顺序。然而,基于规则的优化器用 ROWNUM 来“短路”查询,并在 ROWNUM 子句被满足时返回记录给下一部分查询。

展开更多 50%)
分享

猜你喜欢

在Oracle中实现搜索分页查询

编程语言 网络编程
在Oracle中实现搜索分页查询

Ajax实现分页查询

Web开发
Ajax实现分页查询

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在存储过程中实现分页

Web开发
在存储过程中实现分页

oracle中的connectby在sqlserver中实现

电脑网络
oracle中的connectby在sqlserver中实现

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

在ORACLE中实现SELECTTOPN的方法

电脑网络
在ORACLE中实现SELECTTOPN的方法

在Oracle中实现数据库的复制

编程语言 网络编程
在Oracle中实现数据库的复制

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如果爱情可以收获的话,我只要一颗好种子.

如果爱情可以收获的话,我只要一颗好种子.

想起你的时候,我心里还是会微微的疼

想起你的时候,我心里还是会微微的疼
下拉加载更多内容 ↓