create table emp(
id int,
ename varchar2(30),
sale number(7,2) --共7位xxxxx.xx 最大就是這樣的資料
)
--開發一個包---
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--開始寫分頁的過程
create or replace procedure fenye
(tableName in varchar2,
pagesizes in number,--一頁顯示記錄
pageNow in number,
myrows out number,--總記錄數
myPageCount out number,--總頁數
p_cursor out testpackage.test_cursor--返回的記錄集
)is
--定義變數
--定義sql語句 字串---
v_sql varchar2(1000);--定義sql長度
--定義兩個整數
v_begin number:=(pageNow-1)*pagesizes+1;
v_end number:=pageNow*pagesizes;
begin
--開始執行-----
v_sql:='select * from
(select t1.*,rownum rn from ( select * from '||tableName||' order by sale) t1 where rownum<='||v_end||')
where rn>='||v_begin;
--把遊標和sql關聯----
open p_cursor for v_sql;
--計算myrows和mypageCount
--組織了一個sql 語句
v_sql:='select count(*) from '||tableName;
--執行sql,並把返回的值,賦給 myrows
execute immediate v_sql into myrows;-- 執行字串的sql語句 必須格式
--計算mypageCount--
if mod(myrows,pagesizes)=0 then
myPageCount:=myrows/pagesizes;
else
myPageCount:=myrows/pagesizes+1;
end if;
--關閉遊標
close p_cursor;--必須關閉遊標,不是不能釋放佔有的空間,這很重要
end;
使用java代碼 調用oracle 的預存程序
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.102:1521:orcl","plsqltest","plsqltest");
CallableStatement cs=ct.prepareCall("call fenye(?,?,?,?,?,?)");
//這是一個輸入 參數
cs.setString(1,"emp");
cs.setInt(2,3);
cs.setInt(3,1);
//兩個輸出參數 必須寫上
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
//執行
cs.execute();
// 把傳回值 放入 java 變數中
int sumRows=cs.getInt(4);
int sumPage=cs.getInt(5);
System.out.println("sumRows : is"+sumRows+" sumPage is"+sumPage);
ResultSet rs=(ResultSet)cs.getObject(6);
//關閉
while(rs.next())
{
System.out.println("編號="+rs.getInt(4)+"姓名="+rs.getString(2)+"薪水="+rs.getFloat(3));
}
cs.close();
ct.close();
}catch(Exception e){
e.printStackTrace();
}