2012-11-04 25 views
5

Trong MySql, khái niệm phân trang có thể dễ dàng được thực hiện với một câu lệnh SQL sử dụng mệnh đề LIMIT như sau.Oracle và Pagination

SELECT country_id, country_name 
FROM country c 
ORDER BY country_id DESC 
LIMIT 4, 5; 

Nó sẽ lấy hàng bắt đầu 5-10 trong tập kết quả mà các truy vấn SQL lấy.


Trong Oracle, điều tương tự có thể đạt được bằng số hàng với một subquery khiến cho công việc hơi tẻ nhạt như sau.

SELECT country_id, country_name 
FROM 
    (SELECT rownum as row_num, country_id, country_name 
    FROM 
    (SELECT country_id, country_name 
    FROM country 
    ORDER BY country_id desc) 
    WHERE rownum <= 10 
) 
WHERE row_num >=5; 

Trong Oracle 10g (hoặc cao hơn, tôi không chắc chắn về các phiên bản cao hơn mặc dù), điều này có thể được thực hiện phần nào dễ dàng như,

SELECT country_id, country_name 
    FROM (SELECT country_id, country_name, row_number() over (order by country_id desc) rank 
     FROM country) 
WHERE rank BETWEEN 6 AND 10; 

Về một ứng dụng như một ứng dụng web, khái niệm phân trang được yêu cầu để thực hiện hầu như ở khắp mọi nơi và viết các câu lệnh SQL như vậy mỗi khi một truy vấn (select) được thực hiện đôi khi là một công việc tẻ nhạt.

Giả sử, tôi có một ứng dụng web sử dụng Java. Nếu tôi sử dụng khuôn khổ Hibernate sau đó là một cách trực tiếp để làm như vậy sử dụng một số phương pháp hỗ trợ bởi Hibernate như,

List<Country>countryList=session.createQuery("from Country order by countryId desc") 
.setFirstResult(4).setMaxResults(5).list(); 

nhưng khi tôi chỉ cần sử dụng kết nối JDBC với Oracle như,

String connectionURL = "jdbc:oracle:thin:@localhost:1521:xe"; 
Connection connection = null; 
Statement statement = null; 
ResultSet rs = null; 

Class.forName("oracle.jdbc.OracleDriver").newInstance(); 
connection = DriverManager.getConnection(connectionURL, "root", "root"); 
statement = connection.createStatement(); 
rs = statement.executeQuery("SELECT * from country"); 

Câu hỏi của tôi trong trường hợp này, có cách nào chính xác để truy xuất một dải các hàng được chỉ định bằng mã này không? Giống như trong trường hợp trước bằng cách sử dụng các phương thức giống như setFirstResult()setMaxResults()? hoặc cách duy nhất để đạt được điều này là sử dụng các truy vấn con đó như được chỉ định.

Trả lời

3

Vì 'Không' cũng là một câu trả lời:

Thật không may, bạn sẽ phải sử dụng phương pháp truy vấn phụ. Tôi cá nhân sẽ sử dụng một với thứ hạng (thứ hai).

+0

Cảm ơn bạn đã làm rõ điều đó. – Tiny