Oracle分頁問題


今天在公司遇到一個分頁查詢的bug,查詢第一頁可以查詢到數據,下面也顯示的沒有問題!查詢第二頁時,顯示已經加載完成,但是頁面沒有問題!

通過Debug調試,發現第一頁查詢到的數據沒有問題,第二頁時,查不到數據!

第一頁時,控制台打印的sql語句:

 

SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
FROM 
    ( SELECT m.*,rownum row_id 
       FROM (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY FROM WKF_BUSINESS_CONFIG ) m 
        WHERE rownum >= 1) 
where row_id < 26 

 

第二頁時,控制台打印的sql語句:

SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
FROM 
    ( SELECT m.*,rownum row_id 
       FROM (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY FROM WKF_BUSINESS_CONFIG ) m 
        WHERE rownum >= 26) 
where row_id < 51 

通過分析和查詢oracle分頁的知識,發現是SQL語句有問題!

不能對ROWNUM使用>(大於1的數值)、>=(大於或等於1的數值)、=(大於或等於1的數值),否則無結果
-- 所以直接用只能從1開始
-- rownum >10 沒有記錄,因為第一條不滿足去掉的話,第二條的rownum又成了1,所以永遠沒有滿足條件的記錄。

正好,查詢第二頁的時候,上面的sql語句犯了這個問題!

既然不能>=(大於或等於1的數值),那我就讓rownum<大於1的數!

SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
FROM 
     ( SELECT m.*,rownum row_id 
       FROM 
            (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
             FROM WKF_BUSINESS_CONFIG ) m 
             WHERE rownum <51) 
where row_id >= 26 

 

將sql語句改成這樣時,按照要求可以查詢到數據!

既然遇到了Oracle分頁查詢的問題,正好復習下Oracle分頁的相關知識!

在Mysql中,分頁查詢很簡單!    分頁查詢使用的是limit關鍵字進行查詢。它后面有兩個參數

第一個參數是起始的位置,第二個參數是每頁需要顯示的條目數。

舉例:商品表中有10條記錄,現在需要進行分頁顯示,每頁顯示3條數據。現在需要查看第二頁的數據。那么應該使用的sql語句是:

    select * from product limit 3,3;                     第一個參數計算的公式為:(查詢的頁數-1)*每頁顯示條目數    即 (2-1)*3=3

在Oracle中分頁就沒有那么簡單!Oracle中是通過rownum實現分頁查詢的!

 

不能對ROWNUM使用>(大於1的數值)、>=(大於或等於1的數值)、=(大於或等於1的數值),否則無結果
所以直接用只能從1開始
rownum >10 沒有記錄,因為第一條不滿足去掉的話,第二條的rownum又成了1,所以永遠沒有滿足條件的記錄
select * from student where rownum>=1;

 

如果想要用rownum不從1開始,需按下面方法使用
select a1.* from (select student.*,rownum rn from student) a1 where rn >5

分頁查詢一
select * from (select a1.*,rownum rn from (select * from student) a1 where rownum <=5) where rn>=2;

 

分頁查詢二
select a1.* from (select student.*,rownum rn from student where rownum <=5) a1 where rn >=3;

 

分頁查詢三
select a1.* from (select student.*,rownum rn from student) a1 where rn between 3 and 5;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM