--返回结果集的存储过程
--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();