zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/SummerRain/p/214073.html
Copyright © 2011-2022 走看看