Oracle,分頁,存儲過程三個詞結合起來,來個綜合點的小練習,運用之前的PL/SQL創建一個分頁的存儲過程,只需要簡單幾步即可。
1.聲明一個引用遊標
- create or replace package cur_ref_type
- as-- is or as can be used
- type cur_ref is ref cursor;
- end;
create or replace package cur_ref_type
as-- is or as can be used
type cur_ref is ref cursor;
end;
2.編寫存儲過程
- create or replace procedure divideByPge
- (tableName varchar2,pageSize number,currentPage number,
- totalPage out number,totalRecord out number,results out cur_ref_type.cur_ref)--要帶包名
- is
- v_sql varchar2(200);--用於寫sql語句的
- v_begin number;--開始位置
- v_end number;--結束位置
- begin
- v_begin := (currentPage -1) * pageSize;
- v_end := currentPage * pageSize;
- v_sql :='select count(*) from '||tableName;--將表名字符串拼接sql語句
- execute immediate v_sql into totalRecord;--查詢所有記錄
- totalPage :=ceil(totalRecord/pageSize);--計算總頁數
- v_sql :='select * from (select rownum rn,'||tableName||'.* from '||tableName||' where rownum <= '||v_end||') where rn > '||v_begin;
- open results for v_sql;
- end;
create or replace procedure divideByPge
(tableName varchar2,pageSize number,currentPage number,
totalPage out number,totalRecord out number,results out cur_ref_type.cur_ref)--要帶包名
is
v_sql varchar2(200);--用於寫sql語句的
v_begin number;--開始位置
v_end number;--結束位置
begin
v_begin := (currentPage -1) * pageSize;
v_end := currentPage * pageSize;
v_sql :='select count(*) from '||tableName;--將表名字符串拼接sql語句
execute immediate v_sql into totalRecord;--查詢所有記錄
totalPage :=ceil(totalRecord/pageSize);--計算總頁數
v_sql :='select * from (select rownum rn,'||tableName||'.* from '||tableName||' where rownum <= '||v_end||') where rn > '||v_begin;
open results for v_sql;
end;
3.Java客戶端調用- String driver ="oracle.jdbc.driver.OracleDriver";
- String url = "jdbc:oracle:thin:@localhost:1521:orcl";
- String username = "scott";
- String password = "ysjian";
- try {
- Class.forName(driver);
- Connection conn =
- DriverManager.getConnection(url,username,password);
- CallableStatement cs = conn.prepareCall("{call
- divideByPge(?,?,?,?,?,?)}");
- cs.setString(1,"emp");//表名
- cs.setInt(2, 3);//分頁單位
- cs.setInt(3, 1);//當前頁
- cs.registerOutParameter(4, OracleTypes.INTEGER);//註冊輸出參數
- cs.registerOutParameter(5, OracleTypes.INTEGER);
- cs.registerOutParameter(6, OracleTypes.CURSOR);//註冊輸出參數遊標
- cs.execute();//執行
- ResultSet rs = (ResultSet)cs.getObject(6);//獲得遊標
- while(rs.next()){
- int empno = rs.getInt("empno");
- String ename = rs.getString("ename");
- System.out.println(empno+"-->"+ename);
- }
- } catch (ClassNotFoundException | SQLException e) {
- e.printStackTrace();
- }