`
lms168
  • 浏览: 60226 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

jsp调用oracle存储过程分页

 
阅读更多
首先看下在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>


运行结果如下


  • 大小: 1.7 KB
分享到:
评论
1 楼 aa00aa00 2013-04-28  
例子通俗易懂,我已经成功运行起来了

相关推荐

    毕业设计-源码Java调用Oracle存储过程实现分页功能

    完整课程设计及源码,源码Java调用Oracle存储过程实现分页功能

    Java Oracle分页处理

    &lt;%@ include file="Strutstaglibs.jsp" %&gt; &lt;html&gt; 分页技术信息显示页面 用户名 密 码 生 日 职 业 性 别 &lt;td&gt;&lt;bean:write name="temp" property=...

    java web Pager通用分页组件(源码)

    java web通用分页组件发布了! 超级强悍的java web通用分页组件,只要简单的一条sql语句就可以轻松的实现分页,目前对oracle,SQL Server2005,SQL server200,mysql都做了实现,程序...里面有调用例子oracle的数据库文件.

    二十一道面试程序.txt

    8. 写出Oracle增删改查的存储过程,并在java中调用。 9. 用ajax技术实现一个级联菜单功能。 10.写出插入法进行排序代码。 11.编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是...

    AutoCode代码生成器(Struts1.2版)

    ★ JSP调用页面(全面支持struts1.2)(增、删、改、查),分页功能自动实现 (如果数据库是sqlserver,又需要分页的,请使用sqlserver2005) 2、特色 ☆ 一键生成,简洁使用。 ☆ 生成的代码全部开源,没有任何通过...

    JDBC 3.0数据库开发与设计

    4.2 调用存储过程对象 4.2.1 CallableStatement对象的创建 4.2.2 IN、OUT及INOUT参数的使用 4.2.3 执行CallableStatement Object对象 4.2.4 CallableStatement对象使用实例 4.2.5 SQL Server存储过程编程经验...

    jsp最详细教程 最容易入门

    第1 章 JSP 简介................................................................................10 1.1 什么是JSP........................................10 1.2 JSP 页面.....................................

    千方百计笔试题大全

    234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器...

    java面试宝典

    234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器...

    Java面试宝典2020修订版V1.0.1.doc

    19、oracle分页语句 47 20、从数据库中随机取50条 47 21、order by与group by的区别 47 22、commit在哪里会运用 47 23、行转列、列换行怎么转 48 24、什么是PL/SQL? 49 25、序列的作用 50 26、表和视图的关系 50 27...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题31.jdbc调用存储过程 Java面试题32.简单说一下你对jdbc的理解 Java面试题33.写一个jdbc的访问oracle的列子 Java面试题34.jdbc中preparedStatement比Statement的好处 Java面试题35.数据库连接池的作用 Java...

    AutoCode代码生成器(JAVA版)

    ★ JSP调用页面(增、删、改、查),分页功能自动实现 3、特色: ☆ 一键生成,简洁使用。 ☆ 生成的代码全部开源,没有任何通过插件或链接库来做的操作。 ☆ 支持多表的多主键处理。 ☆ 支持数据事务的操作。 ☆ ...

    autocode中文java版

     ★ JSP调用页面(增、删、改、查),分页功能自动实现  3、特色:  ☆ 一键生成,简洁使用。  ☆ 生成的代码全部开源,没有任何通过插件或链接库来做的操作。  ☆ 支持多表的多主键处理。  ☆ 支持数据事务的...

    Java面试宝典2010版

    22、用JDBC如何调用存储过程 23、JDBC中的PreparedStatement相比Statement的好处 24. 写一个用jdbc连接并访问oracle数据的程序代码 25、Class.forName的作用?为什么要用? 26、大数据量下的分页解决方法。 27、用...

    最新Java面试宝典pdf版

    22、用JDBC如何调用存储过程 109 23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决...

    Java面试笔试资料大全

    22、用JDBC如何调用存储过程 109 23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    JAVA面试题最全集

    5.Java中的分页、效率考虑。 6.简单介绍您所了解的structs。 1.xml在项目中的作用 2.s-EJB 与 e-EJB的区别 3.会话面的作用 4.cmp与bmp的优缺点 5.j2me程序的必需的几个部分 6.c/s与b/s的区别 7.构建一...

    JAVA面试宝典2010

    22、用JDBC如何调用存储过程 109 23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决...

Global site tag (gtag.js) - Google Analytics