编写一个存储过程,要求输入表名、每页显示记录数、当前页。
返回总记录数、总页数,和返回的结果集
*/
--这个是分页查询的模板
select t2.* ,rn from(select t1.*,rownum rn from (select * from emp) t1 where rownum<=10)t2 where rn>=6;
--创建一个包,在该包中,我定义一个类型page_cursor,是个游标
create or replace package pagePackage as
type page_cursor is ref cursor;
end pagePackage;
--开始编写分页过程
create or replace procedure mypage
(tableName in varchar2,--表名
sizeOfPage in number,--每页显示记录数
PageNow in number,--当前页
myrows out number,--返回的总记录数
myPageCount out number,--总页数
result_cursor out pagePackage.page_cursor--返回的总记录集
)is
--定义部分
--定义一个sql语句 字符串
v_sql varchar2(1000);
v_begin number:=1+(pageNow-1)*sizeOfPage;
v_end number:=pageNow*sizeOfPage;
begin
--执行部分
v_sql:='select t2.* ,rn from(select t1.*,rownum rn from (select * from '||tableName
||') t1 where rownum<='||v_end
||')t2 where rn>='||v_begin;
--把游标和sql关联
open result_cursor for v_sql;
--此处若关闭游标,java代码查询不出结果
--close result_cursor;
--计算myrows、myPageCount
--组织一个sql
v_sql:= 'select count(*) from '||tableName;
--执行sql,并把执行结果赋值给参数myrows
execute immediate v_sql into myrows;
if mod(myrows,sizeOfPage)=0 then
myPageCount:=myrows/sizeOfPage;
else
myPageCount:=myrows/sizeOfPage+1;
end if;
--此处若关闭游标,java代码也查询不出结果
--close result_cursor;
end;
package com.freeborders.page;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Page {
/**
* @param args
*/
static String dbUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
//theUser为数据库用户名
static String theUser = "scott";
//thePw为数据库密码
static String thePw = "tiger";
public Page(){
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(dbUrl, theUser, thePw);
CallableStatement cs = conn.prepareCall("{call mypage(?,?,?,?,?,?)}");
//给存储过程的前三个输入in类型的参数赋值
cs.setString(1, "emp");
cs.setInt(2, 2);//每页显示两条
cs.setInt(3, 1);//取出当前页第1页的数据
//给存储过程的输出参数注册
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
//执行存储过程
cs.execute();
//取出总记录数
int rowNums = cs.getInt(4);
//取出总页数
int pageNums = cs.getInt(5);
//取出结果集
ResultSet rs = (ResultSet)cs.getObject(6);
System.out.println("总记录数"+rowNums+" 总页数: "+pageNums);
//将存储过程返回的结果集迭代输出
while(rs.next()){
System.out.println("姓名:"+rs.getString(2)+" 工资: "+rs.getFloat(6));
}
}
catch(Exception e){
e.getMessage();
}
}
}