其实 Oracle数据库的分页还是比较容易理解的。此文以Oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集。
由于需要返回查询出来的结果集,需要在PL/SQL中创建一个package,这个包里面定义一个refcursor类型,用于记录sql语句查询出来的结果集。创建包的代码如下:
create or replace package pagingPackage as
type paging_cursor is ref cursor;
end pagingPackage;
接下来开始Oracle的分页过程,我们可以用select emp.*,rownum from emp;来显示地表示出每行的行标。然后可以根据行标对内容进行分页,下面这个SQL语句可以作为Oracle分页的模板。
select * from
(select t1.*,rownum rn from (select * from emp) t1 where rownum<=12)
where rn>=8;
有了上面的refcursor类型和分页模板,下面开始编写分页的存储过程,代码如下:
create procedure paging
(tableName in varchar2 ,--表名
pageSizes in number,--每页显示记录数
pageNow in number,--当前页
rowNums out number,--总记录数
pageNum out number,--总页数
paging_cursor out pagingPackage.paging_cursor) is
--定义部分
--定义sql语句,字符串
v_sql varchar2(1000);
--定义两个整数,用于表示每页的开始和结束记录数
v_begin number:=(pageNow-1)*pageSizes+1;
v_end number:=pageNow*pageSizes;
begin
--执行部分
v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin;
--把游标和sql语句关联
open paging_cursor for v_sql;
--计算rowNums和pageNum
--组织一个sql语句
v_sql:='select count(*) from '||tableName;
--执行该sql语句,并赋给rowNums
execute immediate v_sql into rowNums;
--计算pageNum
if mod(rowNums,pageSizes)=0 then
pageNum := rowNums/pageSizes;
else
pageNum := rowNums/pageSizes+1;
end if;
end;
在java中编写代码测试分页,代码如下:
package com.test.oracletest;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
//测试分页
public class OraclePaging {
public static void main(String[] args) {
try {
// 加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 获取连接
Connection connection = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "SCOTT", "tiger");
// 创建CallableStatement,调取数据库的存储过程
CallableStatement cst = connection
.prepareCall("{call paging(?,?,?,?,?,?)}");
// 给?赋值
cst.setString(1, "emp");
cst.setInt(2, 6);
cst.setInt(3, 2);
// 注册存储过程的输出项
cst.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
cst.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
cst.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
// 执行
cst.execute();
// 获取输出项
int rowNums = cst.getInt(4);
int pageNum = cst.getInt(5);
ResultSet rs = (ResultSet) cst.getObject(6);
System.out.println("总记录数rowNums = " + rowNums);
System.out.println("总页数pageNum = " + pageNum);
System.out.println("EMPNO" + '\t' + "ENAME" + '\t' + "ROWNUM");
while (rs.next()) {
System.out.println(rs.getInt("EMPNO") + " " + '\t'
+ rs.getString("ENAME") + '\t' + rs.getInt("RN"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
}
}
}
执行的结果如图所示:
我们还可以通过修改模板最内侧的视图来满足其他一些基本的排序要求。Oracle的分页思想就是如此。。#
分享到:
相关推荐
15oracle的PL/SQL编程-分页 PPT 15oracle的PL/SQL编程-分页 PPT
它没有使用PL/SQL语句(比如什么程序包、游标等),只是使用通用的、简单的SQL实现了数据库分页动作。 只要看懂了分页公式,那么这是一个通用的Oracle数据库分页动作(可以使用PHP, JAVA, ASP .NET等其他语言)。 ...
本文实例讲述了Oracle的pl/sql。分享给大家供大家参考,具体如下: 一、pl/sql 是什么 pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展。 pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许...
15.掌握pl/sql编程技术(包括编写过程、函数、触发器...) 16.掌握pl/sql的高级用法(能编写分页过程模块,下订单过程模块..,) 17.会处理oracle常见的例外 18.会编写oracle各种触发器 19.理解视图的概念并能灵活...
1、简单程序 2、限定查询 3、多表查询 4、子查询 5、分页查询 6、单行函数 7、oracle对象操作 8、oracle类型练习 9、java中调用oracle 10、procedure经典练习
韩顺平老师 oracle 教程笔记 1.Oracle 认证,与其它数据库比较,安装 2.Oracle 的基本使用--基本命令 3.oracle 用户管理 4.oracle 表的管理(数据类型,表创建删除,...20.PL/SQL 分页 21.例外处理 22.oracle 的视图
oracle分页查询,以及用java、asp.net调用存储过程的示例。 pl/sql测试包内带结果集的存储过程示例。
10.oracle分页查询 21 (1)删除重复记录 22 11.oracle合并查询 24 12.oracle连接 25 13.oracle函数 26 (1)字符函数 26 (2)数学函数 26 (3)日期函数 27 (4)给表取别名的时候,不能加as;但是给列取别名,是可以加as 27...
分页技术。实验一(1) Developer使用说明(1) 数据库管理(1) PL/SQL(1) Oracle客户端安装与配置(1) Oracle(1) sqlplus和isqlplus基本命令(1) 语言访问数据库(1) 用SQL(1)
该例子针对上次SQL实现分页公式使用的详细说明--说明具体在函数中怎样使用分页公式和SQL怎样在游标中返回的说明,然后JDBC怎样捞取数据,然后通过Servlet与JSP显示出来。当然该函数可以由读者进一步完成,我主要是...
oracl函数 事物 游标 存储 mysql分页 sql语句拼写 pl/sql
17.1.2 谈SQL编写顺序之流言蜚语 451 17.1.3 IN与EXISTS之争 455 17.1.4 总结探讨 457 17.2 误区背后的话题扩展 457 17.2.1 话题扩展之等价与否优先 457 17.2.2 话题扩展之颠覆误区观点 458 17.3 全书完,致...
4.2.5 SQL Server存储过程编程经验技巧 4.3 成批更新(BatchedUpdate) 4.3.1 成批更新所使用的对象 4.3.2 使用成批更新的实例 4.4 行集合对象 4.4.1 设计时行集合 4.4.2 运行时行集合 4.4.3 非标准JDBC API...
ORACLE用户是学习ORACLE数据库中的基础知识,下面就介绍下类系统常用的默认ORACLE用户: 1. sys用户:超级用户,完全是个SYSDBA(管理数据库的人)。拥有dba,sysdba,sysoper等角色或权限。是oracle权限最高的用户,...
一、SQL&PL SQL 1.怎么样大批量的更新数据而不影响正常业务 2.怎么对IN子查询使用绑定变量 3.并发容易出现的问题与并发控制 4.怎么使用object与record类型返回表类型数据 5.怎么样在业务繁忙时期正确的创建表约束...
§10.11 确定数据库对象存储大小 117 §10.11.1 非簇表的大小计算 117 §10.11.2 索引大小计算 119 §10.11.3 簇表的大小计算 120 §10.11.4 位图索引的大小计算 122 §10.12 应用类型设计考虑要点 122 §10.13 应用...
存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), ...