设为首页 收藏本站
查看: 1217|回复: 0

[经验分享] oracle分页以及rownum、rowid的使用

[复制链接]

尚未签到

发表于 2016-7-27 11:26:59 | 显示全部楼层 |阅读模式
分页存储过程:
1.根据ROWID来分,执行时间0.03秒
create or replace procedure del_page(
       cur_page in number,
       num_page in number
)
is
cursor cursor_test is
select * from userinfo where rowid in(select rid from (select rownum rn,rid from(select rowid rid,userinfo.* from
userinfo) where rownum<=cur_page*num_page) where rn>(cur_page-1)*num_page);
begin
       for row_test in cursor_test loop
       dbms_output.put_line(row_test.customerid||'||'||row_test.customername
       ||'||'||row_test.pid||'||'||row_test.telephone||'||'||row_test.address);
       end loop;

  end;
2.按分析函数来分,执行时间1.01秒
create or replace procedure del_page1(
       cur_page in number,
       num_page in number
)
is
cursor cursor_test is
select * from (select t.*,row_number() over(order by customerid desc) rk from userinfo t)
where rk<=cur_page*num_page and rk>(cur_page-1)*num_page;
begin
       for row_test in cursor_test loop
       dbms_output.put_line(row_test.customerid||'||'||row_test.customername
       ||'||'||row_test.pid||'||'||row_test.telephone||'||'||row_test.address);
       end loop;

  end;
3.按ROWNUM来分,执行时间0.1秒
create or replace procedure del_page2(
       cur_page in number,
       num_page in number
)
is
cursor cursor_test is
select t.*,rownum from
        userinfo t
        where rownum<=cur_page*num_page and rownum>(cur_page-1)*num_page;
begin
       for row_test in cursor_test loop
       dbms_output.put_line(row_test.customerid||'||'||row_test.customername
       ||'||'||row_test.pid||'||'||row_test.telephone||'||'||row_test.address);
       end loop;

  end;
1. ROWNUM 的使用
ROWNUM 是一个序列,是 oracle 数据库从数据文件或缓冲区中读取数据的顺序。它取得第 一条记录则 rownum 值为 1,第二条为 2,依次类推。如果你用>,>=,=,between...and 这些条 件,因为从缓冲区或数据文件中得到的第一条记录的 rownum 为 1,则被删除,接着取下条, 可是它的 rownum 还是 1,又被删除,依次类推,便没有了数据。
使用 SELECT 语句返回的结果集,若希望按特定条件查询前 N 条记录,可以使用伪列 ROWNUM。 ROWNUM 是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调: 先要有结果集)。简单的说 ROWNUM 是符合条件结果的序列号。它总是从 1 开始排起的。 使用 ROWNUM 时,只能使用<、<=、!=符号。
1 rownum 是从 1 开始,1 以上的自然数在 rownum 做等于判断时认为都是 false 条件,所以无法查到 rownum = n(n>1 的自然数) 。
2 rownum 对于大于某值的查询条件 如果想找到从第二行记录以后的记录,当使用 rownum>2 是查不出记录的,原因是由于 rownum 是一个总是从 1 开始的伪列,Oracle 认为 rownum> n(n>1 的自然

数)这种条件依 旧不成立,所以查不到记录。 那如何才能找到第二行以后的记录呢?可以使用子查询方法来解决。注意子查询中的 rownum 必须要有别名,否则还是不会查出记录来,这是因为 rownum

不是某个表的列,如 果不起别名的话,无法知道 rownum 是子查询的列还是主查询的列。
3 rownum 对于小于某值的查询条件 如果想找到第三条记录以前的记录,当使用 rownum<3 是能得到两条记录的。显然 rownum 对于 rownum<n(n>1 的自然数)的条件认为是成立的,所以可以找到记录。
 
2. ROWID 的使用——快速删除重复的记录
ROWID 是数据的详细地址, 通过 rowid, oracle 可以快速的定位某行具体的数据的位置。 ROWID 可以分为物理 rowid 和逻辑 rowid 两种。普通的表中的 rowid 是物理 rowid,索 引组织表(IOT)的 rowid 是逻辑 rowid。 当表中有大量重复数据时,可以使用 ROWID 快速删除重复的记录。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-250242-1-1.html 上篇帖子: 使用hint优化 Oracle SQL语句方法 下篇帖子: ORACLE日期时间函数大全 (二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表