--Oracle分頁語句介紹
--為每條記錄編號(hào)
select t1.*,rownum rn from (select * from emp) t1;
--取出前10條記錄
select t1.*,rownum rn from (select * from emp) t1 where rownum<=10;
--取出第6條到第10條記錄,此語句可以作為分頁的一個(gè)模板
-
select * from
(select t1.*,rownum rn from (select * from emp) t1 where rownum<=10)
where rn>=6;
--開始編寫分頁的過程
--1、先創(chuàng)建一個(gè)包,包中定義類型test_cursor,是個(gè)游標(biāo)
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--2、編寫分頁的存儲(chǔ)過程
create or replace procedure fenye
(tableName in varchar2,
pageSize in number,--每頁最多可以顯示的記錄條數(shù)
pageNow in number,--當(dāng)前是第幾頁
myRows out number,--查詢出的記錄總共有多少條
myPageCount out number,--查詢出的記錄總共可以分多少頁
p_cursor out testpackage.test_cursor--返回查詢結(jié)果的記錄集
) is
--定義部分
--定義sql語句
v_sql varchar2(1000);
--定義兩個(gè)整數(shù)并賦值
v_begin number:=(pageNow-1)*pageSize+1;
v_end number:=pageNow*pageSize;
begin
--執(zhí)行部分
--并對(duì)員工工資按由高到低排列
v_sql:='select * from (select t1.*,rownum rn from (select * from '|| tableName
||' order by sal) t1 where rownum<='|| v_end ||') where rn>='|| v_begin;
open p_cursor for v_sql;
--計(jì)算myRows和myPageCount
--重新給v_sql賦值
v_sql:='select count(*) from '||tableName;
--執(zhí)行sql,并把返回的值付給myRows
execute immediate v_sql into myRows;
--計(jì)算myPageCount
if mod(myRows,pageSize)=0 then
myPageCount:=myRows/pageSize;
else
myPageCount:=myRows/pageSize+1;
end if;
--關(guān)閉游標(biāo)
--close p_cursor;
end;
--使用java代碼調(diào)用這個(gè)存儲(chǔ)過程
package test;
import java.sql.*;
public class FenYe{
public static void main(String[] args){
try{
//加載數(shù)據(jù)庫驅(qū)動(dòng)
Class.forName("Oracle.jdbc.driver.OracleDriver");
//獲取數(shù)據(jù)庫連接
Connection conn = DriverManager.getConnection(
"jdbc:Oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");
//創(chuàng)建CallableStatement對(duì)象
CallableStatement cs = conn.prepareCall("{call fenye(?,?,?,?,?,?)}");
//給前三個(gè)輸入?yún)?shù)的?賦值
cs.setString(1,"emp");//要查詢的是emp表
cs.setInt(2,5);//每頁顯示5條記錄
cs.setInt(3,1);//先顯示第一頁
//注冊(cè)總記錄數(shù)
cs.registerOutParameter(4,Oracle.jdbc.OracleTypes.INTEGER);
//注冊(cè)總頁數(shù)
cs.registerOutParameter(5,Oracle.jdbc.OracleTypes.INTEGER);
//注冊(cè)結(jié)果集
cs.registerOutParameter(6,Oracle.jdbc.OracleTypes.CURSOR);
//執(zhí)行存儲(chǔ)過程
cs.execute();
//接收返回的總記錄數(shù)
int rowNum = cs.getInt(4);
//接收返回的總頁數(shù)
int pageCount = cs.getInt(5);
//接收返回的結(jié)果集
ResultSet rs = (ResultSet)cs.getObject(6);
//打印輸出結(jié)果
System.out.println("總記錄數(shù):" + rowNum);
System.out.println("總頁數(shù):" + pageCount);
System.out.println("==========每頁顯示" +5 + "條===========");
System.out.println("==========當(dāng)前是第" +1 + "頁===========");
int i = 1;
while(rs.next()){
System.out.println("(" + (i++) + ")編號(hào):" + rs.getInt(1) + ",姓名:" + rs.getString(2) + ", 工資:" + rs.getInt(6));
}
}catch(Exception e){
e.printStackTrace();
}
}
}
需要說明的是上面的代碼只是為了簡單演示一下調(diào)用數(shù)據(jù)庫中的分頁存儲(chǔ)過程,所以對(duì)數(shù)據(jù)庫資源的連接和關(guān)閉作優(yōu)化(甚至沒有關(guān)閉連接,關(guān)閉結(jié)果集等)。
實(shí)際開發(fā)中是必須關(guān)閉和釋放數(shù)據(jù)庫資源的 本文出自:億恩科技【1tcdy.com】
服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|