oracle存儲過程實現分頁

創建存儲過程:

--創建存放遊標的包--
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);
        }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章