2012-04-08 61 views
2

我有用於JSF分頁這個Java代碼:從SQL查詢檢索的記錄範圍甲骨文

public List<ActiveSessionObj> list(int firstRow, int rowCount, String sortField, boolean sortAscending) throws Exception { 

     String SQL_LIST_BY_ORDER_AND_LIMIT = "SELECT * FROM ACTIVESESSIONSLOG ORDER BY ? ? LIMIT ?, ?"; 



     if (ds == null) { 
      throw new SQLException(); 
     } 

     String sortDirection = sortAscending ? "ASC" : "DESC"; 
     String sql = String.format(SQL_LIST_BY_ORDER_AND_LIMIT, sortField, sortDirection); 
     Connection conn = ds.getConnection(); 
     PreparedStatement preparedStatement = null; 
     ResultSet resultSet = null; 
     List<ActiveSessionObj> dataList = new ArrayList<ActiveSessionObj>(); 

     try { 
      conn.setAutoCommit(false); 
      boolean committed = false; 
      preparedStatement = conn.prepareStatement(sql); 
      preparedStatement.setString(1, sortField); 
      preparedStatement.setString(2, sortDirection); 
      preparedStatement.setInt(3, firstRow); 
      preparedStatement.setInt(4, rowCount); 

      resultSet = preparedStatement.executeQuery(); 
      /* take the result from the SQL query and insert it into Array List collection */ 
      dataList = ActiveSessionsArrayList(resultSet); 

     } catch (SQLException e) { 
      throw new Exception(e); 
     } finally { 
      conn.close(); 
     } 

     return dataList; 
    } 

我用這個SQL語句產生的ArrayList:

SELECT * FROM ACTIVESESSIONSLOG ORDER BY ? ? LIMIT ?, ? 

可以這樣SQL查詢用於Oracle?或者這是MySQL的具體?

最良好的祝願

回答

3
Case1: If you want first `twenty Records` only then 

select * from ( 
    select rn,a.* 
    from Activesessionlogs a 
    order by ??) 
where rn <=20 
order by rn 

Case2:If you want the record between `5 to 10` then 

select * from (
select rownum rn,e.* from Activesessionlogs e order by ??) 
where rn >=5 and rn<=10 
order by rn 

如: 讓我們找到下面

select * from (
select rownum rn,e.* from emp e order by hiredate) 
where rn >=5 and rn<=10 
order by rn asc 

output

注意一個例子:Rownum> or rownum>=不會在相同的查詢。一個工作非常好的博客解釋這個Oracle Rownum

+0

第一個例子(Case1)將**不工作。您不能在聲明中將rownum和訂單合併到同一級別。 – 2012-04-08 13:58:10

+0

@a_horse_with_no_name:先生它正在爲我工​​作,在案件1當我通過聘用訂購時,如果你想我會給你一個例子 – 2012-04-08 14:02:57

+1

結果將**不一致,因爲rownum值被分配*之前*任何訂購已完成。看到我的例子在這裏:http://sqlfiddle.com/#!4/bede9/1 – 2012-04-08 14:05:18

3

LIMIT是MySQL的具體。但是在Oracle中你可以使用rownum這樣的:

SELECT * 
FROM (SELECT columnA, columnB, rownum as my_rownum 
FROM ACTIVESESSIONSLOG 
ORDER BY ? ?) 
WHERE my_rownum <= ? 
AND my_rownum >= ? 
+0

:這個工作'行num> ='在這裏不起作用 – 2012-04-08 13:25:06

+0

正確,我忘了把rownum放到子查詢中,它現在起作用了。 – GavinCattell 2012-04-08 13:41:52

1

不幸的是限制不是Oracle中的有效的語句,它在MySQL中使用。然而甲骨文有,您可以使用限制的行數的變量ROWNUM返回:

select * from mytable where rownum <= 100 and rownum > 50 

從查詢返回第二個50分的記錄。

+0

:這個工作'rownum>'不會在這裏工作 – 2012-04-08 13:25:27