Oracle 高效分頁儲存過程例項 含javademo
阿新 • • 發佈:2019-01-25
關於分頁,想必是每一程式猿都會遇到的問題,解決辦法有很多, 接下來就讓我們嘗試下 oracle 儲存過程實現,直接在資料庫層面實現,重點在於高效
1首先建立 儲存過程用的包,以及宣告儲存過程
--建立包 -- Author : Sugar -- Created : 2014-07-04 -- Purpose : 分頁過程 create or replace package p_page is TYPE type_cur IS REF CURSOR; -- 定義遊標變數用於返回記錄集 PROCEDURE Pagination( Pindex in number, -- 分頁索引 Psql in varchar2, -- 產生 dataset 的 sql 語句 Psize in number, -- 頁面大小 Pcount out number, -- 返回分頁總數 v_cur out type_cur -- 返回當前頁資料記錄 ); procedure PageRecordsCount( Psqlcount in varchar2, -- 產生 dataset 的 sql 語句 Prcount out number -- 返回記錄總數 ); end p_page;
2接下來建立包體,和儲存過程的實現
3現在我們的 sql指令碼已經 完成,接下來可以現在 pl/sql中測試一遍我們寫的 儲存過程是否正確,pl/sql 集成了測試工具,我們直接使用即可--建立包體 create or replace package body p_page is PROCEDURE Pagination( Pindex in number, Psql in varchar2, Psize in number, Pcount out number, v_cur out type_cur ) AS v_sql VARCHAR2(1000); v_count number; v_Plow number; v_Phei number; Begin ------------------------------------------------------------ 取分頁總數 v_sql := 'select count(*) from (' || Psql || ')'; execute immediate v_sql into v_count; Pcount := ceil(v_count/Psize); ------------------------------------------------------------ 顯示任意頁內容 v_Phei := Pindex * Psize + Psize;--得到記錄上限 v_Plow := v_Phei - Psize + 1; --得到記錄下限 --例如: Psql := 'select rownum rn,t.* from emp t' ; -- 要求必須包含 rownum 欄位 v_sql := 'select * from (' || Psql || ') where rn between ' || v_Plow || ' and ' || v_Phei ; open v_cur for v_sql; End Pagination; procedure PageRecordsCount( Psqlcount in varchar2, Prcount out number ) as v_sql varchar2(1000); v_prcount number; begin v_sql := 'select count(*) from (' || Psqlcount || ')'; execute immediate v_sql into v_prcount; Prcount := v_prcount; -- 返回記錄總數 end PageRecordsCount; end p_page;
我們可是用系統自帶的 emp表去測試 ,我的測試結果如下:
4 測試成功後 ,我們接下來 將儲存過程應用到 java工程當中去
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestProcedureDemo3 { public static void main(String[] args) { String driver = "oracle.jdbc.driver.OracleDriver"; String strUrl = "jdbc:oracle:thin:@192.168.1.100:1521:orcl"; //本機IP不能用localhost取代 Statement stmt = null; //建立statement ResultSet rs = null; //建立結果集 Connection conn = null; //構造資料庫 會話 CallableStatement proc = null; // 建立 CallableStatement 物件 用於呼叫儲存過程 try { Class.forName(driver); conn = DriverManager.getConnection(strUrl, "scott", "tiger"); //呼叫儲存過程 PAGINATION proc = conn.prepareCall("{ call P_PAGE.PAGINATION(?,?,?,?,?) }"); //設定輸入引數 proc.setInt(1, 0); proc.setString(2, "select rownum rn,t.* from emp t"); proc.setInt(3, 3); //繫結輸出引數型別 proc.registerOutParameter(4,oracle.jdbc.OracleTypes.NUMBER); proc.registerOutParameter(5,oracle.jdbc.OracleTypes.CURSOR); proc.execute(); int number = proc.getInt(4); System.out.println("當前分頁總數"+ number); rs = (ResultSet) proc.getObject(5); while (rs.next()) { System.out.println("<tr><td>" + rs.getString(1) + "</td><td>" + rs.getString(2) + "</td></tr>"+ rs.getString(3) + "</td></tr>"+ rs.getString(4) + "</td></tr>"); } //呼叫儲存過程 PAGERECORDSCOUNT proc = conn.prepareCall("{ call P_PAGE.PAGERECORDSCOUNT(?,?) }"); proc.setString(1, " emp "); proc.registerOutParameter(2,oracle.jdbc.OracleTypes.NUMBER); proc.execute(); int recordCount = proc.getInt(2); System.out.println("當前記錄總數"+ recordCount); } catch (SQLException ex2) { ex2.printStackTrace(); } catch (Exception ex2) { ex2.printStackTrace(); } finally { try { if (rs != null) { rs.close(); if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } } catch (SQLException ex1) { } } } }
5 備註,java工程中需要匯入 oracle 驅動包(odbc14.jar) 執行即可出現如下效果 ,應用成功
以上即是本人的學習筆記,雖然不多,但是非常適合oracle 初學者理解儲存過程 ,非常具有實用效果 ,若有疑問,歡迎拍磚~~