創建存儲過程:
--創建存放遊標的包--
create or replace package page_package
is
--申明遊標--
type page_cursor is ref cursor;
end page_package;
--創建查詢所有用戶的過程--
create or replace procedure proc_getAllUser(users out page_package.page_cursor)
as
begin
open users for
select * from tuser;
end;
--創建分頁存儲過程--
create or replace procedure proc_page(
tableName in varchar2,--需要查詢的表名--
pageNum in number,--查詢頁碼--
pageSize in number,--每頁條數--
term in varchar,--查詢條件,形如: and name = ? and ......--
datas out page_package.page_cursor,--查詢出來的數據--
maxPageNum out number --最大頁碼--
)is
--定義需要執行的sql語句的變量--
v_sql varchar2(1000);
--定義兩個整數變量--
v_begin number:=(pageNum-1)*pageSize+1;
v_end number:=pageNum*pageSize;
--定義最大條數的變量--
v_count number:=0;
begin
--給v_sql賦值--
v_sql := 'select p.* from(select t.*,rownum rn from '||tableName||' t where 1=1 '||term||') p where p.rn between '||v_begin||' and '||v_end;
--執行sql給遊標賦值--
open datas for v_sql;
--計算最大頁碼--
v_sql := 'select count(*) from '||tableName||' where 1=1 '||term;
execute immediate v_sql into v_count;
if mod(v_count,pageSize)=0 then
maxPageNum := v_count/pageSize;
else
maxPageNum := v_count/pageSize+1;
end if;
end;
分頁sql:
--分頁的sql--
select p.* from
(select t.*,rownum rn from torganization t) p where p.rn between 2 and 4
使用:
private ResultSet rs;
private CallableStatement cst;
String sql = "{call proc_page(?,?,?,?,?,?)}";
try {
con = getCon();
cst = con.prepareCall(sql);
cst.setString(1, "torganization");
cst.setInt(2, 1);
cst.setInt(3, 2);
cst.setString(4, " and description like '%是%'");
cst.registerOutParameter(5, oracle.jdbc.OracleTypes.CURSOR);
cst.registerOutParameter(6, oracle.jdbc.OracleTypes.NUMBER);
cst.execute();
int maxPageNum = cst.getInt(6);
rs = (ResultSet)cst.getObject(5);
System.out.println("最大頁碼是:"+maxPageNum);
System.out.println("數據:");
while(rs.next()){
System.out.println(rs.getString("org_name"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
this.closeAll(rs, cst, con);
}