兩種可能性:
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必須先讀取100萬行。
實際上,'ORDER BY'不應該在內部查詢中,而應該在內部查詢的內部查詢中。 –
好點。編輯考慮到這一點。謝謝。 – eaolson