今天在公司遇到一個分頁查詢的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;