1. 程式人生 > >plsql 返回結果集的儲存過程

plsql 返回結果集的儲存過程

 --返回結果集的儲存過程 
--1.建立一個包,在該包中定義了一個遊標型別test_corsor
create or replace package testpackage as 
type test_cursor is ref cursor;
end testpackage;

--2.建立儲存過程
create or replace procedure lt_pro1
(ltNo in number, t_cursor out testpackage.test_cursor) is
begin
      open t_cursor for select * from emp where deptno=ltNo;

end;

--3.如何在java中呼叫

// 1.載入驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.得到連線
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","scott","tiger");
// 3.建立CallableStatement
CallableStatement cs = ct.prepareCall("{call lt_pro1(?,?)}");
// 4.給?賦值
cs.setInt(1, 10);
// 第二個引數傳oracle自帶的型別遊標
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
// 5.執行
cs.execute();
// 得到結果集
ResultSet rs = (ResultSet) cs.getObject(2);
while(rs.next()){
System.out.println(rs.getInt(1)+" " +rs.getString(2));
}
// 關閉
cs.close();
ct.close();

oracle分頁


select * from (select t1.*, rownum rn from (select * from emp) t1 where rownum<=10) where rn>=6; 
 
--1.建立一個包,在該包中定義了一個遊標型別test_corsor
create or replace package testpackage as 
type test_cursor is ref cursor;
end testpackage;


-- 儲存過程返回分頁記錄
create or replace procedure fenye
(tableName in varchar2, --表名
myPageSize in number, --每頁幾條記錄
pageNo in number, -- 當前頁
allcount out number, -- 總記錄數
pagecount out number, -- 總頁數
t_cursor out testpackage.test_cursor --返回的記錄集
) is
-- 定義部分
v_sql varchar2(1000);
-- 定義兩個整數
v_begin number:=(pageNo-1)*myPageSize+1;
v_end number:=pageNo*myPageSize;
begin
-- 執行部分
v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||') t1 
where rownum<='||v_end||') where rn>='||v_begin;
-- 把遊標和sql關聯
open t_cursor for v_sql;
-- 計算總頁數和總記錄數
v_sql:='select count(*) from '||tableName;
-- 執行sql語句,並把結果付給allcount
execute immediate v_sql into allcount;
-- 計算總頁數
if mod(allcount,myPageSize)=0 then
pageCount:=allcount/myPageSize;
else
pageCount:=allcount/myPageSize+1;
end if;
-- 關閉遊標 
--close t_cursor;
end;

// 1.載入驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.得到連線
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","scott","tiger");
// 3.建立CallableStatement
CallableStatement cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");
// 4.給?賦值
cs.setString(1, "emp");
cs.setInt(2, 5);
cs.setInt(3, 1);
// 第二個引數傳oracle自帶的型別遊標
cs.registerOutParameter(4, java.sql.Types.INTEGER);
cs.registerOutParameter(5, java.sql.Types.INTEGER);
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
// 5.執行
cs.execute();
// 得到結果集
int count=cs.getInt(4);
int pageCount= cs.getInt(5);
System.out.println(count);
System.out.println(pageCount);
ResultSet rs = (ResultSet) cs.getObject(6);
while(rs.next()){
System.out.println(rs.getInt(1)+" " +rs.getString(2));
}
// 關閉
cs.close();
ct.close();