pl/sql之編寫分頁過程,plsql編寫分頁
--開發一個包
--建立一個包,在該包中,我定義類型test_cursor,是個遊標。 如下:
Sql代碼
- create or replace package testpackage as
- TYPE test_cursor is ref cursor;
- end testpackage;
--開始編寫分頁過程
create or replace procedure fenye
(table_name in varchar2,
page_size in number, --每頁顯示的記錄數
page_now in number, --當前頁
order_by in varchar2, --附加--排序條件
total_rows out number, --總記錄數
total_pages out number, --總頁數
p_cursor out testpackage.test_cursor --返回的記錄集
) is
--定義部分
--定義SQL語句的字串
v_sql varchar2(500);
v_start number := (page_now-1)*page_size+1;
v_end number := page_now*page_size;
begin
--執行部分
v_sql:='select * from (select t1.*, rownum rn from (select * from '||table_name||' order by '||order_by||') t1 where rownum<='||v_end||') where rn>='||v_start;
--把遊標和SQL關聯
open p_cursor for v_sql;
--計算總記錄數和總頁數
--組織另一個sql
v_sql:='select count(*) from '||table_name;
--執行上面的sql語句,並將返回值付給total_rows;
execute immediate v_sql into total_rows;
--計算total_pages(--總頁數)
if mod(total_rows, page_size)=0 then
total_pages:=total_rows/page_size;
else
total_pages:=total_rows/page_size+1;
end if;
--此處不能關閉遊標,否則在JAVA中調用時,會出現 遊標已經關閉exception,導致取不到結果集
---close p_cursor;
end;
/
------------------------------------------------------------------------------------------------使用java測試
//測試分頁
package oracle.plsql.test.fenye;
import java.sql.*;
/**
* //調用一個分頁的預存程序
create or replace procedure fenye
(table_name in varchar2, --表名
page_size in number, --每頁顯示的記錄數
page_now in number, --當前頁
order_by in varchar2, --排序條件
total_rows out number, --總記錄數
total_pages out number, --總頁數
p_cursor out testpackage.test_cursor --返回的記錄集
)
*/
public class TestPlSqlFenye {
public static void main(String[] args){
Connection ct = null;
CallableStatement cs = null;
try{
//1.載入驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到串連
ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:BJSXT","scott","tiger");
//看看如何調用有返回值的過程
//3.建立CallableStatement
cs = ct.prepareCall("{call fenye(?,?,?,?, ?,?,?)}");
//4.給前4個?賦值
cs.setString(1, "emp");
cs.setInt(2, 6); //每頁顯示6條
cs.setInt(3, 1); //顯示第1頁
cs.setString(4,"sal");
//給後3個?註冊參數
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER); //注意這裡的這個類型
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER); //注意這裡的這個類型
cs.registerOutParameter(7, oracle.jdbc.OracleTypes.CURSOR); //注意這裡的這個類型
//5.執行
cs.execute();
System.out.println(cs.getInt(5));
System.out.println(cs.getInt(6));
//得到結果集 ,在這裡取出來的時候就是結果集了
ResultSet rs=(ResultSet)cs.getObject(7);
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getFloat("SAL"));
}
} catch(Exception e){
e.printStackTrace();
} finally{
//6.關閉各個開啟的資源
try {
cs.close();
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
-------------------------------------------------------------------------------------------console顯示結果如下:14
3
7369 SMITH 671.17
7900 JAMES 950.71
7876 ADAMS 1100.0
7521 WARD 1250.0
7654 MARTIN 1250.0
7934 MILLER 1300.0
oracle有輸入輸出的分頁過程在pl/sql裡怎調用
DECLARE
xhname VARCHAR2(4000);
BEGIN
xh_pro8(7521,xhname);
END;
執行這個,把7521換成你自己輸入的ID號
oracle可以給我一個 通用分頁支援多表查詢的預存程序放到PL/sql裡面直接運行編輯測試成功的, 了
關注中!