Oracle數據庫使用存儲過程實現分頁


注:本示例來源於韓順平[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;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM