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         }
  • 相关阅读:
    redis
    sqlalchemy ORM
    元类的理解
    python连接mysql
    ffmpeg去水印
    ffmpeg给视频加文字水印
    yt-seo-checklist
    ffmpeg下载直播流
    ffmpeg拼接mp4视频
    ffmpeg截取视频
  • 原文地址:https://www.cnblogs.com/wintersun/p/778387.html
Copyright © 2011-2022 走看看