两种可能:
1)您的表是索引组织的表。所以它的数据是排序的。您将选择要避免的第一行,并基于此获得您要查找的下一行:
create or replace procedure get_records
(
vi_start_ind integer,
vi_end_ind integer,
vo_cursor out sys_refcursor
) as
begin
open vo_cursor for
select *
from test
where rownum <= vi_end_ind - vi_start_ind + 1
and rowid not in
(
select rowid
from test
where rownum < vi_start_ind
)
;
end;
2)您的表不是索引组织的,通常是这种情况。然后它的记录没有排序。要获取记录 m 到 n,您必须告诉系统您的想法是什么顺序:
create or replace procedure get_records
(
vi_start_ind number,
vi_end_ind number,
vo_cursor out sys_refcursor
) as
begin
open vo_cursor for
select *
from test
where rownum <= vi_end_ind - vi_start_ind + 1
and rowid not in
(
select rowid from
(
select rowid
from test
order by somthing
)
where rownum < vi_start_ind
)
order by something
;
end;
说了这么多,想想你想要达到什么。如果要使用此过程逐块读取表,请记住它会一次又一次地读取相同的数据。要知道第 1,000,001 到 1,000,100 行是什么,dbms 必须首先读取一百万行。