`
897371388
  • 浏览: 530363 次
文章分类
社区版块
存档分类
最新评论

PL/SQL中编写Oracle数据库分页的存储过程

 
阅读更多

其实 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 15oracle的PL/SQL编程-分页 PPT

    使用简单的SQL语句实现的Oracle数据库分页技术

    它没有使用PL/SQL语句(比如什么程序包、游标等),只是使用通用的、简单的SQL实现了数据库分页动作。 只要看懂了分页公式,那么这是一个通用的Oracle数据库分页动作(可以使用PHP, JAVA, ASP .NET等其他语言)。 ...

    Oracle教程之pl/sql简介

    本文实例讲述了Oracle的pl/sql。分享给大家供大家参考,具体如下: 一、pl/sql 是什么 pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展。 pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许...

    Oracle 基础知识 -大全- 原创整理.pdf

    15.掌握pl/sql编程技术(包括编写过程、函数、触发器...) 16.掌握pl/sql的高级用法(能编写分页过程模块,下订单过程模块..,) 17.会处理oracle常见的例外 18.会编写oracle各种触发器 19.理解视图的概念并能灵活...

    oracle Pl/sql编程经典入门

    1、简单程序 2、限定查询 3、多表查询 4、子查询 5、分页查询 6、单行函数 7、oracle对象操作 8、oracle类型练习 9、java中调用oracle 10、procedure经典练习

    oracle实用教程-韩顺平

    韩顺平老师 oracle 教程笔记 1.Oracle 认证,与其它数据库比较,安装 2.Oracle 的基本使用--基本命令 3.oracle 用户管理 4.oracle 表的管理(数据类型,表创建删除,...20.PL/SQL 分页 21.例外处理 22.oracle 的视图

    oracle分页查询

    oracle分页查询,以及用java、asp.net调用存储过程的示例。 pl/sql测试包内带结果集的存储过程示例。

    oracle使用管理笔记(一些经验的总结)

    10.oracle分页查询 21 (1)删除重复记录 22 11.oracle合并查询 24 12.oracle连接 25 13.oracle函数 26 (1)字符函数 26 (2)数学函数 26 (3)日期函数 27 (4)给表取别名的时候,不能加as;但是给列取别名,是可以加as 27...

    分页技术实现+jsp+Oracle

    分页技术。实验一(1) Developer使用说明(1) 数据库管理(1) PL/SQL(1) Oracle客户端安装与配置(1) Oracle(1) sqlplus和isqlplus基本命令(1) 语言访问数据库(1) 用SQL(1)

    使用Eclipse 3.3演示Oracle9i/10g的函数完成的分页动作

    该例子针对上次SQL实现分页公式使用的详细说明--说明具体在函数中怎样使用分页公式和SQL怎样在游标中返回的说明,然后JDBC怎样捞取数据,然后通过Servlet与JSP显示出来。当然该函数可以由读者进一步完成,我主要是...

    oracle mysql 笔记

    oracl函数 事物 游标 存储 mysql分页 sql语句拼写 pl/sql

    收获不止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 全书完,致...

    JDBC 3.0数据库开发与设计

    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学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE用户是学习ORACLE数据库中的基础知识,下面就介绍下类系统常用的默认ORACLE用户: 1. sys用户:超级用户,完全是个SYSDBA(管理数据库的人)。拥有dba,sysdba,sysoper等角色或权限。是oracle权限最高的用户,...

    SQL&PL SQL FAQ第二版

    一、SQL&PL SQL 1.怎么样大批量的更新数据而不影响正常业务 2.怎么对IN子查询使用绑定变量 3.并发容易出现的问题与并发控制 4.怎么使用object与record类型返回表类型数据 5.怎么样在业务繁忙时期正确的创建表约束...

    ORACLE9i_优化设计与系统调整

    §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培训第一期

    存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), ...

Global site tag (gtag.js) - Google Analytics