2013-10-27 33 views
0

我需要編寫一個程序來挑記錄給定的行需要編寫一個程序來獲取給定的rownums

例如

procedure test1 
(
start_ind number, 
end_ind number, 
p_out ref cursor 
) 

begin 
opecn p_out for 
select * from test where rownum between start_ind and end_ind; 
end; 

當我們通過start_ind 1和end_ind 10日working.But當我們start_ind更改爲5

然後查詢看起來像

select * from test where rownum between 5 and 10; 

和它失敗並且不顯示輸出。

請協助如何解決此問題。謝謝!

回答

2

分配了rownum,然後評估了where條件。因爲你永遠不會有結果集中ROWNUM一個1-4,你永遠不會ROWNUM 5.你需要的東西是這樣的:

SELECT * FROM ( 
    SELECT rownum AS rn, t.* 
     FROM (
     SELECT t.* 
      FROM test t 
     ORDER BY t.whatever 
    ) 
    WHERE ROWNUM <= 10 
) 
WHERE rn >= 5 

你還需要一個ORDER BY子句中的內選擇,或者你得到的哪些行將是未定義的。

本文由湯姆·凱特幾乎告訴你需要知道的一切:http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

+0

實際上,'ORDER BY'不應該在內部查詢中,而應該在內部查詢的內部查詢中。 –

+0

好點。編輯考慮到這一點。謝謝。 – eaolson

0

兩種可能性:

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萬行。

1
SELECT * 
    from (SELECT rownum AS rn, t.* 
      FROM MyTable t 
     WHERE ROWNUM <= 10 
     ORDER BY t.NOT-Whatever 
     -- (its highly important to use primary or unique key of MyTable)   
WHERE rn > 5 

作爲提示,:
通常我們使用store-procedures進行數據驗證,訪問控制,廣泛或複雜的處理,需要幾個SQL語句的執行。存儲過程可能會返回結果集,即SELECT語句的結果。這樣的結果集可以使用遊標,其他存儲過程,關聯結果集定位器或應用程序來處理。我認爲您將使用ruw-number來獲取分頁查詢。
嘗試根據上述想法創建generic select query

相關問題