zoukankan      html  css  js  c++  java
  • Oracle通用分页包

          根据网上流传的版本,修改而成,加入了新的重载。包定义如下:

     1 /*****************************************************************
     2  *功能描述: 大数据量分页通用存储过程包定义
     3  *创建人:   Melodicsoul    
     4  *创建时间: 2007-05-28
     5  *****************************************************************/
     6 create or replace package p_page is
     7 type refCursorType is REF CURSOR;  --游标类型定义,用于返回数据集
     8 procedure sp_Page(p_PageSize int,          --每页记录数
     9                   p_PageNo int,            --当前页码,从 1 开始
    10                   p_SqlSelect varchar2,    --查询语句,含排序部分
    11                   p_OutRecordCount out int,--返回总记录数
    12                   p_OutCursor out refCursorType);
    13 procedure sp_Page(p_PageSize int,          --每页记录数
    14                   p_PageNo int,            --当前页码,从 1 开始
    15                   p_SqlSelect varchar2,    --查询语句,含排序部分
    16                   p_SqlCount varchar2,     --获取记录总数的查询语句
    17                   p_OutRecordCount out int,--返回总记录数
    18                   p_OutCursor out refCursorType);
    19 procedure sp_Page(p_PageSize int,        --每页记录数
    20                   p_PageNo int,          --当前页码,从 1 开始
    21                   p_SqlSelect varchar2,  --查询语句,含排序部分
    22                   p_OutCursor out refCursorType);
    23 procedure sp_Page(p_SqlSelect varchar2,    --查询语句,含排序部分
    24                   p_OutRecordCount out int); --返回总记录数
    25 end p_page;
        包主体:
      1 CREATE OR REPLACE PACKAGE BODY p_page as
      2 procedure sp_Page(p_PageSize int,          --每页记录数
      3                   p_PageNo int,            --当前页码,从 1 开始
      4                   p_SqlSelect varchar2,    --查询语句,含排序部分
      5                   p_OutRecordCount out int,--返回总记录数
      6                   p_OutCursor out refCursorType)
      7 as
      8     v_sql varchar2(3000);
      9     v_count int;
     10     v_heiRownum int;
     11     v_lowRownum int;
     12 begin
     13   ----取记录总数
     14   v_sql := 'select count(*) from (' || p_SqlSelect || ')';
     15   execute immediate v_sql into v_count;
     16   p_OutRecordCount := v_count;
     17   ----执行分页查询
     18   v_heiRownum := p_PageNo * p_PageSize;
     19   v_lowRownum := v_heiRownum - p_PageSize + 1;
     20 
     21   v_sql := 'SELECT *
     22             FROM (
     23                   SELECT A.*, rownum rn
     24                   FROM  ('|| p_SqlSelect ||') A
     25                   WHERE rownum <= '|| to_char(v_heiRownum) || '
     26                  ) B
     27             WHERE rn >= ' || to_char(v_lowRownum) ;
     28             --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
     29 
     30   OPEN p_OutCursor FOR  v_sql;
     31 
     32 end sp_Page;
     33 
     34 /*****************************************************************
     35  *功能描述: 大数据量分页通用存储过程(重载1,推荐使用)
     36  *创建人:   Melodicsoul    
     37  *创建时间: 2007-05-28
     38  *****************************************************************/
     39 procedure sp_Page(p_PageSize int,          --每页记录数
     40                   p_PageNo int,            --当前页码,从 1 开始
     41                   p_SqlSelect varchar2,    --查询语句,含排序部分
     42                   p_SqlCount varchar2,     --获取记录总数的查询语句
     43                   p_OutRecordCount out int,--返回总记录数
     44                   p_OutCursor out refCursorType)
     45 as
     46     v_sql varchar2(3000);
     47     v_count int;
     48     v_heiRownum int;
     49     v_lowRownum int;
     50 begin
     51   ----取记录总数
     52   execute immediate p_SqlCount into v_count;
     53   p_OutRecordCount := v_count;
     54   ----执行分页查询
     55   v_heiRownum := p_PageNo * p_PageSize;
     56   v_lowRownum := v_heiRownum - p_PageSize + 1;
     57 
     58   v_sql := 'SELECT *
     59             FROM (
     60                   SELECT A.*, rownum rn
     61                   FROM  ('|| p_SqlSelect ||') A
     62                   WHERE rownum <= '|| to_char(v_heiRownum) || '
     63                  ) B
     64             WHERE rn >= ' || to_char(v_lowRownum) ;
     65             --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
     66 
     67   OPEN p_OutCursor FOR  v_sql;
     68 
     69 end sp_Page;
     70 
     71 /*****************************************************************
     72  *功能描述: 大数据量分页通用存储过程(重载2)
     73  *创建人:   Melodicsoul    
     74  *创建时间: 2007-05-28
     75  *****************************************************************/
     76 procedure sp_Page(p_PageSize int,        --每页记录数
     77                   p_PageNo int,          --当前页码,从 1 开始
     78                   p_SqlSelect varchar2,  --查询语句,含排序部分
     79                   p_OutCursor out refCursorType)
     80 as
     81     v_sql varchar2(3000);
     82     --v_count int;
     83     v_heiRownum int;
     84     v_lowRownum int;
     85 begin
     86 /*
     87   ----取记录总数
     88   v_sql := 'select count(*) from (' || p_SqlSelect || ')';
     89   execute immediate v_sql into v_count;
     90   p_OutRecordCount := v_count;
     91 */
     92   ----执行分页查询
     93   v_heiRownum := p_PageNo * p_PageSize;
     94   v_lowRownum := v_heiRownum - p_PageSize + 1;
     95 
     96   v_sql := 'SELECT *
     97             FROM (
     98                   SELECT A.*, rownum rn
     99                   FROM  ('|| p_SqlSelect ||') A
    100                   WHERE rownum <= '|| to_char(v_heiRownum) || '
    101                  ) B
    102             WHERE rn >= ' || to_char(v_lowRownum) ;
    103             --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
    104 
    105   OPEN p_OutCursor FOR  v_sql;
    106 end sp_Page;
    107 /*****************************************************************
    108  *功能描述: 大数据量分页通用存储过程(重载3)
    109  *创建人:   Melodicsoul    
    110  *创建时间: 2007-05-28
    111  *****************************************************************/
    112 procedure sp_Page(p_SqlSelect varchar2,    --查询语句,含排序部分
    113                   p_OutRecordCount out int)--返回总记录数            
    114 as
    115     v_sql varchar2(3000);
    116     v_count int;
    117 begin
    118   ----取记录总数
    119   v_sql := 'select count(*) from (' || p_SqlSelect || ')';
    120   execute immediate v_sql into v_count;
    121   p_OutRecordCount := v_count;
    122 end sp_Page;
    123 end p_page;
    调用的C#代码(此处是EnterpriseLibrary3.0+AspnetPager):
     1         /// <summary>
     2         /// 取总记录数 
     3         /// 创建人:   Melodicsoul(http://wintersun.cnblogs.com
     4         /// 创建时间: 2007-06-10
     5         /// </summary>
     6         private void GetCount()
     7         {
     8             Database db = DatabaseFactory.CreateDatabase("OracleConnection");
     9             string sqlCommand = "P_PAGE.sp_Page";
    10             DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
    11             db.AddInParameter(dbCommand, "p_SqlSelect", DbType.String, "sys_operator");
    12             db.AddOutParameter(dbCommand, "p_OutRecordCount", DbType.Int32, 4);
    13             db.ExecuteNonQuery(dbCommand);
    14             Pager1.RecordCount = (int)dbCommand.Parameters["p_OutRecordCount"].Value;
    15             BindData2();
    16         }
    17         /// <summary>
    18         /// OracleDataBase 绑定数据
    19         /// 创建人:   Melodicsoul (http://wintersun.cnblogs.com)    
    20         /// 创建时间: 2007-06-10
    21         /// </summary>
    22         private void BindData2()
    23         {
    24             OracleDatabase db = new OracleDatabase(System.Configuration.ConfigurationManager.ConnectionStrings["OracleConnection"].ToString());
    25             string sqlCommand = "P_PAGE.sp_Page";
    26             OracleCommand dbCommand = (OracleCommand)db.GetStoredProcCommand(sqlCommand);
    27            
    28             db.AddInParameter(dbCommand, "p_PageSize", DbType.Int32, Pager1.PageSize);
    29             db.AddInParameter(dbCommand, "p_PageNo", DbType.Int32, Pager1.CurrentPageIndex);
    30             db.AddInParameter(dbCommand, "p_SqlSelect", DbType.String, "Select * from sys_operator");
    31 
    32             dbCommand.Parameters.Add("p_OutCursor", OracleType.Cursor).Direction = ParameterDirection.Output;
    33             this.GridView1.DataSource = db.ExecuteReader(dbCommand);
    34             this.GridView1.DataBind();
    35           
    36         }
  • 相关阅读:
    CentOS虚拟机和物理机共享文件夹实现
    集训第六周 数学概念与方法 概率 数论 最大公约数 G题
    集训第六周 数学概念与方法 概率 F题
    集训第六周 E题
    集训第六周 古典概型 期望 D题 Discovering Gold 期望
    集训第六周 古典概型 期望 C题
    集训第六周 数学概念与方法 UVA 11181 条件概率
    集训第六周 数学概念与方法 UVA 11722 几何概型
    DAG模型(矩形嵌套)
    集训第五周 动态规划 K题 背包
  • 原文地址:https://www.cnblogs.com/wintersun/p/778387.html
Copyright © 2011-2022 走看看