设为首页 收藏本站
查看: 1042|回复: 0

[经验分享] jsp调用oracle存储过程分页

[复制链接]

尚未签到

发表于 2016-7-22 08:41:08 | 显示全部楼层 |阅读模式
首先看下在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>&nbsp;&nbsp;&nbsp;");
}
for(int i=pageNow;i<pageNow+3;i++){  
if(i<=pageCount)      //使其不超过总页数
out.print("<a href=oracleProcedureFengye.jsp?pageNow="+i+">"+i+"</a>&nbsp;&nbsp;&nbsp;");
}  
if(pageNow<pageCount)  
out.print("<a href=oracleProcedureFengye.jsp?pageNow="+(pageNow+1)+">下一页</a>");
%>

<br>
</body>
</html>


运行结果如下
DSC0000.bmp

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-247578-1-1.html 上篇帖子: Oracle 数据文件 大小设置 说明 下篇帖子: Compare the function: SQL server vs ORACLE
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表