JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » JDBC/SQL討論區 » Oracle  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 實現 Oracle 上的分頁顯示 [精華]
error21h

吃飽睡,睡飽吃



發文: 60
積分: 2
於 2004-06-04 10:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
常聽到有人問 關於資料分頁的問題,之前在其他版上有看過
整理一下內容,如下.....

oracle 分頁顯示的sql
Oracle不支持類似於 MySQL 中的 limit. 但你還是可以
rownum來限制返回的結果集的行數.

如果你只希望返回前十行紀錄,你可以這樣寫:

1
SELECT * FROM table WHERE ROWNUM<10; 


但是下面的語句是不對的:
1
SELECT * FROM table WHERE ROWNUM>90 AND ROWNUM<100; 


這是因為 Oracle 認為這個條件不成立,所以沒有返回。
你應該這樣寫:
1
2
3
4
5
SELECT * FROM table WHERE ROWNUM<101; 
 
minus 
 
SELECT * FROM table WHERE ROWNUM<91;


補充一下ResultSet常用的方法:
如何控制結果集ResultSet的指針,使之能夠上下移動?
在JDK1.1中,ResultSet類中只定義了next()方法支持數據指針的下移.
但在Java 2中,ResultSet類增加了如下方法支持數據指針的移動,包括:
ResultSet.first():將數據指針移到結果集的第一行
ResultSet.last(): 將數據指針移到結果集的最後一行
ResultSet.previous(): 將數據指針上移一行

參考看看....:)~


reply to postreply to post
作者 Re:實現 Oracle 上的分頁顯示 [Re:error21h]
anthonychen

外線交給我

版主

發文: 2033
積分: 8
於 2004-06-04 10:52 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
補充一下,如果要使用 ResuleSet 的 previous() 這些前後移動 cursor 的功能,必須在建立Statement物件時給定 ResultSet.TYPE_SCROLL_SENSITIVE 或是 ResultSet.TYPE_SCROLL_INSENSITIVE 的參數

以 Java Tutorial 裡的範例程式為例:

1
2
3
4
5
6
7
8
9
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                     ResultSet.CONCUR_READ_ONLY);
ResultSet srs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
srs.afterLast();
while (srs.previous()) {
  String name = srs.getString("COF_NAME");
  float price = srs.getFloat("PRICE");
  System.out.println(name + "     " + price);
}


reply to postreply to post
作者 Re:實現 Oracle 上的分頁顯示 [Re:error21h]
精靈





發文: 86
積分: 7
於 2004-06-09 01:46 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不過要小心一點,如果有 order by 的指令在,就不能用 ROWNUM<10 來作分頁,這是在作 Oracle 分頁最讓人頭疼的地方。

reply to postreply to post
作者 Re:實現 Oracle 上的分頁顯示 [Re:error21h]
atriatri





發文: 110
積分: 0
於 2004-06-09 17:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
這種是小問題吧?
這樣不就解決了,還可以order by
1
2
3
4
5
select * from 
(select rownum as ranking, ename, job, sal from emp order by empno )
where ranking between 1 and 5
 


reply to postreply to post
作者 Re:實現 Oracle 上的分頁顯示 [Re:atriatri]
精靈





發文: 86
積分: 7
於 2004-06-09 23:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
可是若照上述語法來作分頁,那效能並不好,我實際用 9I 測試,在資料筆數五千筆的主檔裡,連續執行數次來取平均執行速度,發現這樣寫法來作分頁,速度比直接 select ename, job, sal from emp order by empno 還慢。

我的說法正確嗎 ? (我自己不太有把握)


reply to postreply to post
作者 Re:實現 Oracle 上的分頁顯示 [Re:error21h]
sulo





發文: 4
積分: 0
於 2004-06-11 18:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
這樣分頁行不?
if (ResultSet.next())

{ ResultSet.absolute(-1)
int rowCount = ResultSet.getRow();
int totalpage =rowCount / per-page
};


reply to postreply to post
作者 Re:實現 Oracle 上的分頁顯示 [Re:error21h]
benny139





發文: 198
積分: 2
於 2004-11-16 22:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
大大
但 rownum 只有 oracle 才有,
萬一有天更換DB,
那不就...
建議還是用 sulo 的方法卡好...


reply to postreply to post
作者 Re:實現 Oracle 上的分頁顯示 [Re:error21h]
kentyeh





發文: 638
積分: 6
於 2004-11-17 09:35 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Oracle 分頁可以使用oracle.jdbc.rowset.OracleCachedRowSet(在ocrs12.jar內)
1
2
3
4
5
6
7
8
9
public ResultSet getResultSet(....){
  ....
  rs = stmt.executeQuery("SELECT ...");
  Class CachedRowSetClass = Class.forName("oracle.jdbc.rowset.OracleCachedRowSet");
  CachedRowSet crs = (CachedRowSet)(CachedRowSetClass.newInstance());
  crs.setPageSize(每頁大小);
  crs.populate(rs,從第幾筆開始抓一頁大小的筆數);
  ....
  return crs;


reply to postreply to post
作者 Re:實現 Oracle 上的分頁顯示 [Re:error21h]
老陳





發文: 161
積分: 2
於 2005-06-14 19:11 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
error21h wrote:

但是下面的語句是不對的:
1
SELECT * FROM table WHERE ROWNUM>90 AND ROWNUM<100; 


這是因為 Oracle 認為這個條件不成立,所以沒有返回。
你應該這樣寫:
1
2
3
4
5
SELECT * FROM table WHERE ROWNUM<101; 
 
minus 
 
SELECT * FROM table WHERE ROWNUM<91;



上面那個SQL不對的原因應該是沒有加上=,只要改成以下的方式就可以了
1
SELECT * FROM table WHERE ROWNUM>=90 AND ROWNUM<=100; 


這樣的話error21h兄提供的兩種方式都可以適用 ^^

另外如果有order by的話要怎麼辦呢?我查過網路上的文章後,得到以下的解法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT * FROM
     (SELECT A.*, rownum r
       FROM
          
          -- 這裡的SQL可以改成你真正要執行的SQL
          (SELECT *  FROM Articles
           ORDER BY PubTime DESC 
          ) A
          --
 
           -- 用上面的SQL得回來的集合,使用rownum去比對,這樣rownum就會從這    
              個集合的第一筆資料開始往下計算,所以這邊是抓取前100筆
            WHERE rownum <= 100
           
     ) B 
         
         --  B集合總共有A集合和r(rownum)的資料,這裡是抓取大於第90筆的
         WHERE r > 90;


參考連結: http://blog.joycode.com/percyboy/archive/2004/09/14/33445.aspx

不過這些SQL最好能寫在外部設定檔裡面,這樣如果要切換成SQL Server的話只要改設定檔就好,不用改程式


reply to postreply to post
電腦是害人的工具,但是上帝卻可以藉著它行奇妙的大能
» JWorld@TW »  JDBC/SQL討論區 » Oracle

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8