oracle分页以及rownum、rowid的使用

分页存储过程:
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 快速删除重复的记录。

你可能感兴趣的:(oracle)