jsp调用oracle存储过程分页

5 篇文章 0 订阅
首先看下在oracle中一般的分页代码


select * from emp; --分页代码分解式第一步

select e.*,rownum rn from (select * from emp)e;--分页代码分解式第二步

select e.*,rownum rn from (select * from emp)e where rownum<10; ;--分页代码分解式第第三步


select * from (select e.*,rownum rn from (select * from emp)e where rownum<10) where rn>6; --最终的分页代码




然后看下oracle存储过程中的通用分页代码的写法

--由于返回值一个是集合,所以不能用一般的参数,必须先创建一个packageg,里面包含游标类型
--第一步创建一个package
create or replace package fengyepackage as
type fengye_cursor is ref cursor; --创建游标类型变量fengye_cursor
end fengyepackage;

--第二步创建一个procedure
create or replace procedure sp_fengye(pageNow in number,pageSise in number,tableName in varchar2,sortOrder in varchar2,pageCount out number,fengye_cursor out fengyepackage.fengye_cursor) is
v_rowCount number(2); --总记录数目
v_pageCount number(2); --总页数
v_fromline number(2); --从第v_fromline行开始获取返回值
v_toline number(2); --到v_toline number行结束
v_sql varchar2(1000); --装载sql语句的变量
begin
v_sql:='select count(*) from '||tableName; --组织一个sql
execute immediate v_sql into v_rowCount; --执行sql,并且把返回值赋给v_rowCount
if mod(v_rowCount,pageSise)=0 then --用v_rowCount%pageSise=0的取余数的方式是错误的,这是java代码里面的用法
v_pageCount:=v_rowCount/pageSise;
else
v_pageCount:=ceil(v_rowCount/pageSise); --ceil相当于加了1
end if;
v_toline:=pageNow*pageSise;
v_fromline:=(pageNow-1)*pageSise;
pageCount:=v_pageCount;
v_sql:='select * from (select e.*,rownum rn from (select * from '||tableName||' '||sortOrder||')e where rownum<='||v_toline||') where rn>'||v_fromline;--两个连接符号之间要用空格隔开,否则java程序无法识别
open fengye_cursor for v_sql;
--close fengye_cursor; --关闭游标,但是现在不能关闭否则java程序调用不到数据
--把游标的结果集传给JAVA的resultset之是不需要我们来手动的关闭游标的,因为JAVA把这个结果集接收过来的之后,如果JAVA对这个结果集操作完毕的话,JAVA会把这个结果集关闭掉的,不需要我们手动的去作任何操作!
end;




相关的东西已经准备好了,现在看下在jsp中如何调用这个存储过程,如果使用mvc结构可以把相关代码提到业务逻辑层,这里为了方便展示就直接写在一起了

<%@ page language="java" import="java.sql.*,java.util.*" pageEncoding="gbk"%>
<%@page import="oracle.jdbc.OracleTypes"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String pageNowStr=request.getParameter("pageNow"); //当前是第几页
int pageNow=1;
if(pageNowStr!=null){
pageNow=Integer.valueOf(pageNowStr);
}
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>

<body>
<table border="1">

<%//这些代码可以移到业务逻辑成
Connection conn=null;
CallableStatement cs=null;
ResultSet result=null;
int pageCount=0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int pageSize=3; //每页多少条记录


try {
String sql="{call sp_fengye(?,?,?,?,?,?)}";
cs=conn.prepareCall(sql);
cs.setInt(1,pageNow); //注册当前页数
cs.setInt(2,pageSize); //注册每页多少条记录
cs.setString(3,"dept"); //注册要查询的表
cs.setString(4,"order by deptno desc"); //注册排序条件
cs.registerOutParameter(5,oracle.jdbc.OracleTypes.NUMBER); //注册返回值,总共分了多少页
cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR); //注册返回值,当前页的所有记录
cs.execute();
pageCount=cs.getInt(5); //获取总共分了多少条记录
// System.out.println("pageCount"+pageCount);
result=(ResultSet)cs.getObject(6);
while(result.next()){ //循环取出当前页的记录
out.print("<tr><td>"+result.getInt(1)+"</td><td>"+ result.getString(2)+"</td></tr>");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{

result.close();

cs.close();
conn.close();
}
%>
</table>
<%
if(pageNow!=1){
out.print("<a href=oracleProcedureFengye.jsp?pageNow="+(pageNow-1)+">上一页</a>   ");
}
for(int i=pageNow;i<pageNow+3;i++){
if(i<=pageCount) //使其不超过总页数
out.print("<a href=oracleProcedureFengye.jsp?pageNow="+i+">"+i+"</a>   ");

}
if(pageNow<pageCount)
out.print("<a href=oracleProcedureFengye.jsp?pageNow="+(pageNow+1)+">下一页</a>");
%>


<br>
</body>
</html>


运行结果如下

[img]http://dl.iteye.com/upload/attachment/579442/2eecd1cf-c109-33a9-9efa-3766daa122c2.bmp[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值