Oracle大数据量分页通用存储过程

/*根据网友资料修改的,见笑了*/

type refCursorType is REF CURSOR;  --游标类型定义,用于返回数据集

/*****************************************************************
 *功能描述: 大数据量分页通用存储过程
 *创 建 人: 夏春涛 xchuntao@163.com qq:23106676
 *创建时间: 2005-06-29
 *****************************************************************/
procedure sp_Page(p_PageSize int,          --每页记录数
                  p_PageNo int,            --当前页码,从 1 开始
                  p_SqlSelect varchar2,    --查询语句,含排序部分
                  p_OutRecordCount out int,--返回总记录数
                  p_OutCursor out refCursorType)
as
    v_sql varchar2(3000);
    v_count int;
    v_heiRownum int;
    v_lowRownum int;
begin
  ----取记录总数
  v_sql := 'select count(*) from (' || p_SqlSelect || ')';
  execute immediate v_sql into v_count;
  p_OutRecordCount := v_count;
  ----执行分页查询
  v_heiRownum := p_PageNo * p_PageSize;
  v_lowRownum := v_heiRownum - p_PageSize + 1;

  v_sql := 'SELECT *
            FROM (
                  SELECT A.*, rownum rn
                  FROM  ('|| p_SqlSelect ||') A
                  WHERE rownum <= '|| to_char(v_heiRownum) || '
                 ) B
            WHERE rn >= ' || to_char(v_lowRownum) ;
            --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
 
  OPEN p_OutCursor FOR  v_sql;

end sp_Page;

/*****************************************************************
 *功能描述: 大数据量分页通用存储过程(重载1,推荐使用)
 *创 建 人: 夏春涛
 *创建时间: 2005-07-01
 *****************************************************************/
procedure sp_Page(p_PageSize int,          --每页记录数
                  p_PageNo int,            --当前页码,从 1 开始
                  p_SqlSelect varchar2,    --查询语句,含排序部分
                  p_SqlCount varchar2,     --获取记录总数的查询语句
                  p_OutRecordCount out int,--返回总记录数
                  p_OutCursor out refCursorType)
as
    v_sql varchar2(3000);
    v_count int;
    v_heiRownum int;
    v_lowRownum int;
begin
  ----取记录总数
  execute immediate p_SqlCount into v_count;
  p_OutRecordCount := v_count;
  ----执行分页查询
  v_heiRownum := p_PageNo * p_PageSize;
  v_lowRownum := v_heiRownum - p_PageSize + 1;

  v_sql := 'SELECT *
            FROM (
                  SELECT A.*, rownum rn
                  FROM  ('|| p_SqlSelect ||') A
                  WHERE rownum <= '|| to_char(v_heiRownum) || '
                 ) B
            WHERE rn >= ' || to_char(v_lowRownum) ;
            --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
 
  OPEN p_OutCursor FOR  v_sql;

end sp_Page;

/*****************************************************************
 *功能描述: 大数据量分页通用存储过程(重载2)
 *创 建 人: 夏春涛
 *创建时间: 2005-07-01
 *****************************************************************/
procedure sp_Page(p_PageSize int,        --每页记录数
                  p_PageNo int,          --当前页码,从 1 开始
                  p_SqlSelect varchar2,  --查询语句,含排序部分
                  p_OutCursor out refCursorType)
as
    v_sql varchar2(3000);
    --v_count int;
    v_heiRownum int;
    v_lowRownum int;
begin
/*
  ----取记录总数
  v_sql := 'select count(*) from (' || p_SqlSelect || ')';
  execute immediate v_sql into v_count;
  p_OutRecordCount := v_count;
*/
  ----执行分页查询
  v_heiRownum := p_PageNo * p_PageSize;
  v_lowRownum := v_heiRownum - p_PageSize + 1;

  v_sql := 'SELECT *
            FROM (
                  SELECT A.*, rownum rn
                  FROM  ('|| p_SqlSelect ||') A
                  WHERE rownum <= '|| to_char(v_heiRownum) || '
                 ) B
            WHERE rn >= ' || to_char(v_lowRownum) ;
            --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
 
  OPEN p_OutCursor FOR  v_sql;

end sp_Page;

时间: 2024-10-03 15:20:49

Oracle大数据量分页通用存储过程的相关文章

mysql limit大数据量分页优化方法

Mysql的优化是非常重要的.其他最常用也最需要优化的就是limit.Mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降. 同样是取10条数据 select * from yanxue8_visit limit 10000,10 和 select * from yanxue8_visit limit 0,10 就不是一个数量级别的. 网上也很多关于limit的五条优化准则,都是翻译自Mysql手册,虽然正确但不实用.今天发现一篇文章写了些关于limit优

mysql limit 大数据量分页优化方法

Mysql的优化是非常重要的.其他最常用也最需要优化的就是limit.Mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降. 同样是取10条数据 select * from yanxue8_visit limit 10000,10 和 select * from yanxue8_visit limit 0,10 就不是一个数量级别的. 网上也很多关于limit的五条优化准则,都是翻译自Mysql手册,虽然正确但不实用.今天发现一篇文章写了些关于limit优

大数据量分页存储过程效率测试附测试代码与结果

测试环境 硬件:CPU 酷睿双核T5750 内存:2G 软件:Windows server 2003 + sql server 2005 OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 复制代码 代码如下: create database data_Test --创建数据库 data_Test GO use data_Test GO create table tb_TestTable --创建表 (id int identity(1,1) pri

一个比较实用的大数据量分页存储过程

比较|存储过程|分页|数据 create proc sp_PublicTurnPageWebSite( @TBName  nvarchar(100)='', --表名,如 pinyin @PageSize int=10,   --每页的记录数,默认为 10 @CurPage int=1,   --表示当前页 1 @KeyField nvarchar(100)='ID', --关键字段名,默认为 ID,该字段要求是表中的索引 或 无重复和不为空的字段 @KeyAscDesc nvarchar(4)

大数据量分页存储过程效率测试附测试代码与结果_MsSql

测试环境 硬件:CPU 酷睿双核T5750 内存:2G 软件:Windows server 2003 + sql server 2005 OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 复制代码 代码如下: create database data_Test --创建数据库 data_Test  GO use data_Test GO create table tb_TestTable --创建表 (id int identity(1,1) pr

一个比较实用的大数据量分页存储过程_MsSql

create proc sp_PublicTurnPageWebSite( @TBName nvarchar(100)='', --表名,如 pinyin @PageSize int=10, --每页的记录数,默认为 10 @CurPage int=1, --表示当前页 1 @KeyField nvarchar(100)='ID', --关键字段名,默认为 ID,该字段要求是表中的索引 或 无重复和不为空的字段 @KeyAscDesc nvarchar(4)='ASC', --关键字的升.降序,

oracle大数据量的导入和导出

oracle|数据 在oracle中批量数据的导出是借助sqlplus的spool来实现的.批量数据的导入是通过sqlload来实现的.大量数据的导出部分如下:/*************************** *  sql脚本部分 demo.sql begin **************************//************************** * @author meconsea * @date 20050413 * @msn meconsea@hotmail.

关于oracle大数据量导入后进行处理的疑问,效率低下

问题描述 有300w的订购关系数据.需要导入到数据库中,然后将每一条数据分发到不同的区域订购表.我的处理流程:1. 首先建一张临时数据表.用sqlldr将300w数据导入到临时表中2. 用存储过程遍历这张表.每次取5w的数据,放到游标中.然后每一条去做处理,分发到不同的订购表中.3. 将这5w条数据处理过后,提交,并在临时表中删除这5w条数据.然后循环,再取5w处理.直到临时表中数据删除.测试结果显示,这样的效率很差.50w的数据处理差不多就要一个小时.是不是我的处理方式有问题.或者5w的数据放

asp 大数据量分页实例代码

<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> <html><head><title>后台</title> <meta http-equiv=content-type content="text/html; charset=gb2312"> <% set rs=server.createobject("