注:本示例来源于韩顺平[10天玩转oracle数据库]视频教程

1、创建包同时创建游标

create or replace package pagingPackage is
type paging_cursor is ref cursor;
end;
/

2、创建分页存储过程

create or replace procedure paging_cursor
(
v_in_table in varchar2,
v_in_pagesize in number,
v_in_pagenow in number,
v_out_result out pagingPackage.paging_cursor,
v_out_rows out number,
v_out_pagecount out number
) is
--定义需要的变量
v_sql varchar2(4000);
v_sql_select varchar2(4000);
v_start number;
v_end number;
begin
--计算v_start和v_end是多少
v_start:=v_in_pagesize*(v_in_pagenow-1)+1;
v_end:=v_in_pagesize*v_in_pagenow;
v_sql:='select t2.* from (select t1.*,rownum rn from (select * from '||v_in_table||') t1 where rownum<='||v_end||') t2 where rn>='||v_start; --打开游标,让游标指向结果集
open v_out_result for v_sql; --查询共有多少条记录
v_sql_select:='select count(*) from '||v_in_table;
execute immediate v_sql_select into v_out_rows; --统计多少页记录
if mod(v_out_rows,v_in_pagesize)=0 then
v_out_pagecount:=v_out_rows/v_in_pagesize;
else
v_out_pagecount:=v_out_rows/v_in_pagesize+1;
end if; --关闭游标
close v_out_result;
end;
/

3、java调用分页存储过程(完整)源代码

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet; public class TestProcedurePaging {
// 调用oracle分页存储过程并获得存储过程的返回结果集。
public static void main(String[] args) {
// 定义需要的变量
Connection ct = null;
CallableStatement cs = null;
ResultSet rs = null;
try {
// 加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver"); // 得到连接
ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger"); // 创建CallableStatement接口
cs = ct.prepareCall("{call paging_cursor(?,?,?,?,?,?)}"); // 给in?赋值
cs.setString(1, "emp");// 传表名
cs.setInt(2, 6);// 传入pagesize,每页显示多少条记录
cs.setInt(3, 1);// 传入pagenow,显示第几页。
// 给out?注册
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR);
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER); // 执行
cs.execute(); // 这里是关键所在,java没有接收结果集的get方法,所以只能用getObject来接收结果集,接收到后需要使用ResultSet强转才可以
rs = (ResultSet) cs.getObject(4);
// 循环取出
while (rs.next()) {
System.out.println(rs.getString("ename") + " " + rs.getString("sal"));
}
// 取出总记录数
int rowCount = cs.getInt(5);
// 取出总页数
int pageCount = cs.getInt(6); System.out.println("共有记录:" + rowCount + "条! " + "共有记录:" + pageCount + "页!"); } catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (cs != null) {
cs.close();
}
if (rs != null) {
rs.close();
}
if (ct != null) {
ct.close();
}
} catch (Exception e) {
e.printStackTrace();
}
cs = null;
rs = null;
ct = null;
}
}
}

Oracle数据库使用存储过程实现分页的更多相关文章

  1. JAVA操作ORACLE数据库的存储过程

    一.任务提出 JAVA操作oracle11g存储过程实验需要完成以下几个实例: 1.调用没有返回参数的过程(插入记录.更新记录) 2.有返回参数的过程 3.返回列表的过程 4.返回带分页的列表的过程. ...

  2. 基于SSH框架、Oracle数据库、easyui的分页显示

    要求:在easyui-datagrid中完成paginaton的分页功能. 1.easyui-datagrig的配置 <table id="dg" rownumbers=tr ...

  3. Oracle数据库基础--存储过程和函数

    一.存储过程和函数 存储过程: 对一个模块的封装 函数: 功能与存储过程几乎一样 区别: 函数必须通过return 关键字返回一个值 存储过程: 不需要return返回值 参数: 输入型参数 输出型参 ...

  4. oracle数据库中存储过程使用MD5算法加密

    一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFU ...

  5. Oracle数据库跟踪存储过程

    1.[右击]该存储过程 ——>勾选[添加调试信息]——>点击[测试]选项 2.输入对应参数,点击下图左上角红框按钮,开始跟踪,可逐语句逐过程跟踪

  6. oracle数据库中的存储过程

    存储过程是一组为了完成特定功能的sql语句集,是一段sql代码片段,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果存储过程存在参就给出,不存在就不用给出参数)来执行它.因为它是一段 ...

  7. 160316、实时处理oracle数据库中表的数据变化

    http://blog.csdn.net/as339000204/article/details/45390727     近期接受项目需求,需要实时处理oracle数据库中表的数据变化,首先想到的是 ...

  8. mysql、sql server、oracle数据库分页查询及分析(操作手册)

    1.mysql分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实 ...

  9. Oracle数据库的SQL分页模板

    在系统开发过程中,需要对数据进行查询,大部分情况下从数据库中查询的数据量比较大,在系统页面无法全部显示,而且查询全部的数据会影响系统的反应速度,需要对所查询的数据进行分页的查询操作,以此减轻系统的压力 ...

随机推荐

  1. BackgroundWorker用法

    BackgroundWorker主要用来提供后台运算服务(防止用户前台无响应等待),并提供服务进度的类: 代码如下: BackgroundWorker bgw = new BackgroundWork ...

  2. python高级编程之元类(第3部分结束)

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元编程 #new-style类带来了一种能力,通过2个特殊方法(_ ...

  3. ios想要取消执行延时调用的方法

    想要取消执行延时调用的方法: [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(hideDia ...

  4. All X(思维)

    All X Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

  5. hdu 4427 Math Magic

    一个长了一张数学脸的dp!!dp[ i ][ s ][ t ] 表示第 i 个数,sum为 s ,lcm下标为 t 时的个数.显然,一个数的因子的lcm还是这个数的因子,所以我们的第三维用因子下标代替 ...

  6. 概率dp ZOJ 3640

    Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...

  7. 连数据库是ODBC好还是OLEDB好

    1.连数据库是ODBC好还是OLEDB好?2.是不是只有微软的数据库才可以用OLEDB?3.要切换这两种连接,是不是只需要修改连接字符串?谢谢大家了,小弟对这三个问题不解 分享到:   2009-03 ...

  8. Pull生成&解析

    开篇注意,由于解析有可能有大文件非常耗时,建议另开一个线程解析也可以不开具体视情况而定     Pull生成 1.通过xml获得序列化的实例 XmlSerializer nxs = Xml.newSe ...

  9. Xcode的代码片段快捷方式-Code Snippet Library(代码片段库)

    最近换了新电脑,装上Xcode敲代码发现很多以前攒的Code Snippet忘记备份了,总结了一下Code Snippet的设置方法,且行且添加,慢慢积累吧. 如下图:   Title - Code ...

  10. CSS 设计彻底研究(四)盒子的浮动与定位

    第四章 盒子的浮动与定位 本章的重点和难点是深刻地理解”浮动“和”定位“这两个重要的性质,对于复杂页面的排版至关重要. 4.1 盒子的浮动 在标准流中,一个块级元素在水平方向会自动伸张,直到包含它的元 ...