注:本示例來源於韓順平[10天玩轉oracle數據庫]視頻教程
1、創建包同時創建游標
create or replace package pagingPackage is type paging_cursor is ref cursor; end; /
2、創建分頁存儲過程
create or replace procedure paging_cursor ( v_in_table in varchar2, v_in_pagesize in number, v_in_pagenow in number, v_out_result out pagingPackage.paging_cursor, v_out_rows out number, v_out_pagecount out number ) is --定義需要的變量 v_sql varchar2(4000); v_sql_select varchar2(4000); v_start number; v_end number; begin --計算v_start和v_end是多少 v_start:=v_in_pagesize*(v_in_pagenow-1)+1; v_end:=v_in_pagesize*v_in_pagenow; v_sql:='select t2.* from (select t1.*,rownum rn from (select * from '||v_in_table||') t1 where rownum<='||v_end||') t2 where rn>='||v_start; --打開游標,讓游標指向結果集 open v_out_result for v_sql; --查詢共有多少條記錄 v_sql_select:='select count(*) from '||v_in_table; execute immediate v_sql_select into v_out_rows; --統計多少頁記錄 if mod(v_out_rows,v_in_pagesize)=0 then v_out_pagecount:=v_out_rows/v_in_pagesize; else v_out_pagecount:=v_out_rows/v_in_pagesize+1; end if; --關閉游標 close v_out_result; end; /
3、java調用分頁存儲過程(完整)源代碼
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; public class TestProcedurePaging { // 調用oracle分頁存儲過程並獲得存儲過程的返回結果集。 public static void main(String[] args) { // 定義需要的變量 Connection ct = null; CallableStatement cs = null; ResultSet rs = null; try { // 加載驅動 Class.forName("oracle.jdbc.driver.OracleDriver"); // 得到連接 ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger"); // 創建CallableStatement接口 cs = ct.prepareCall("{call paging_cursor(?,?,?,?,?,?)}"); // 給in?賦值 cs.setString(1, "emp");// 傳表名 cs.setInt(2, 6);// 傳入pagesize,每頁顯示多少條記錄 cs.setInt(3, 1);// 傳入pagenow,顯示第幾頁。 // 給out?注冊 cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR); cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER); cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER); // 執行 cs.execute(); // 這里是關鍵所在,java沒有接收結果集的get方法,所以只能用getObject來接收結果集,接收到后需要使用ResultSet強轉才可以 rs = (ResultSet) cs.getObject(4); // 循環取出 while (rs.next()) { System.out.println(rs.getString("ename") + " " + rs.getString("sal")); } // 取出總記錄數 int rowCount = cs.getInt(5); // 取出總頁數 int pageCount = cs.getInt(6); System.out.println("共有記錄:" + rowCount + "條! " + "共有記錄:" + pageCount + "頁!"); } catch (Exception e) { e.printStackTrace(); } finally { // 關閉資源 try { if (cs != null) { cs.close(); } if (rs != null) { rs.close(); } if (ct != null) { ct.close(); } } catch (Exception e) { e.printStackTrace(); } cs = null; rs = null; ct = null; } } }