綜合練習:分頁的存儲過程
-- 聯繫,創建分頁的存儲過程
--1.聲明一個引用遊標
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;
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();
}