• Oracle数据分页,并传出数据集


    1、创建Package

    create or replace package forPaged is
           type my_csr is ref cursor;
           procedure getPaged(tableName in varchar2,objectid in number,fields in varchar2,wherecase in varchar2,orderFieldStr  varchar2,pageSize in number,pageIndex in number,expression varchar2,totalCount out number,csr out forPaged.my_csr);
    end forPaged;

    2、创建存储过程;里面用到了父子级联查询;SQL中如果用到了单引号,需要再用一个单引号转义

    create or replace procedure getPaged(tableName in varchar2,objectid in number,fields in varchar2,wherecase in varchar2,orderFieldStr in varchar2,pageSize in number,pageIndex in number,expression varchar2,totalCount out number,csr out forPaged.my_csr) is
         v_sql varchar2(1000);
         v_begin number:=(pageIndex-1)*pageSize+1; --开始记录
         v_end number:=pageIndex*pageSize;         --结束记录
         begin
           v_sql:='select count(*) from (select entitycode from '|| tableName ||' where '|| wherecase||' and Exists(select distinct companycode from company where '||tableName||'.entitycode=company.companycode start with object_id='||objectid||' connect by prior object_id=parent_id)) t';
           execute immediate v_sql into totalCount;
           if expression is not null then
             v_sql:='select '|| fields ||','||expression||' HeJi from
             (select t.* ,rownum rn from (select '|| fields ||' from '|| tableName|| ' where '|| wherecase ||' and Exists(select distinct companycode from company where '||tableName||'.entitycode=company.companycode start with object_id='||objectid||' connect by prior object_id=parent_id) order by '|| orderFieldStr ||' ) t) 
            where rn>='|| v_begin||' and rn<='|| v_end;
          else
            
            v_sql:='select '|| fields ||' from
              (select t.* ,rownum rn from (select '|| fields ||' from '|| tableName|| ' where '|| wherecase ||' and Exists(select distinct companycode from company where '||tableName||'.entitycode=company.companycode start with object_id='||objectid||' connect by prior object_id=parent_id) order by '|| orderFieldStr ||' ) t) 
            where rn>='|| v_begin||' and rn<='|| v_end;
            end if;
              open csr for v_sql;
              --close csr;关闭后则不会传出数据集
           end getPaged;

    3、Asp.Net中使用

     1  /// <summary>
     2         /// 使用存储过程实现的分页查询
     3         /// </summary>
     4         /// <param name="dataTableName">数据表</param>
     5         /// <param name="objectid">实体表主键</param>
     6         /// <param name="fields">表中字段拼接的字符串</param>
     7         /// <param name="wherecase">查询条件</param>
     8         /// <param name="pagesize">每页显示数据行数</param>
     9         /// <param name="pageIndex">当前页</param>
    10         /// <param name="orderFieldStr">排序字段拼接的字符串</param>
    11         /// <param name="totalCount">符合条件总记录数</param>
    12         /// <param name="expression">计算表达式</param>
    13         /// <returns></returns>
    14         public DataTable getReportDataByPage(M_SelectData model, out int totalCount)
    15         {
    16             IList<OracleParameter> dataParameters = new List<OracleParameter>();
    17             dataParameters.Add(new OracleParameter("tableName", model.tableName));
    18             dataParameters.Add(new OracleParameter("objectid", model.companyId));
    19             dataParameters.Add(new OracleParameter("fields", model.fieldsStr));
    20             dataParameters.Add(new OracleParameter("wherecase", model.whereStr));
    21             dataParameters.Add(new OracleParameter("pageSize", model.pageSize));
    22             dataParameters.Add(new OracleParameter("pageIndex", model.pageIndex));
    23             dataParameters.Add(new OracleParameter("orderFieldStr", model.orderFieldStr));
    24             dataParameters.Add(new OracleParameter("expression", model.expression));
    25             dataParameters.Add(new OracleParameter("totalCount", OracleType.Int32));
    26             dataParameters.Add(new OracleParameter("csr", OracleType.Cursor));
    27             dataParameters[dataParameters.Count - 1].Direction = ParameterDirection.Output;
    28             dataParameters[dataParameters.Count - 2].Direction = ParameterDirection.Output;
    29             DataTable dataTable = OracleSqlHelper.ExcuteProcedure("getpaged", dataParameters.ToArray());
    30             totalCount = int.Parse(dataParameters[dataParameters.Count - 2].Value.ToString());
    31             return dataTable;
    32         }
    业务逻辑层
     1   /// <summary>
     2         /// 分页存储过程
     3         /// </summary>
     4         /// <param name="proName">存储过程名字</param>
     5         /// <param name="parameters">tableName表名,fields查询字段字符串,wherecase查询条件,orderFieldStr排序字段字符串,pageSize每页显示数据行数,pageIndex页码,totalCount总记录数,传出,csr游标,传出</param>
     6         /// <returns></returns>
     7         public static DataTable ExcuteProcedure(string proName, OracleParameter[] parameters)
     8         {
     9             DataTable table = new DataTable();
    10             using (OracleConnection conn = new OracleConnection(connStr))
    11             {
    12                 using (OracleCommand comm = new OracleCommand(proName, conn))
    13                 {
    14                     if (parameters.Length > 0)
    15                     {
    16                         comm.Parameters.AddRange(parameters);
    17                     }
    18                     comm.CommandType = CommandType.StoredProcedure;
    19                     conn.Open();
    20                     OracleDataAdapter oda = new OracleDataAdapter(comm);
    21                     DataSet ds = new DataSet();
    22                     oda.Fill(ds);
    23                     //得到查询结果表
    24                     table = ds.Tables[0];
    25                 }
    26             }
    27             return table;
    28         }
    数据操作层
  • 相关阅读:
    ReentrantLock实现原理分析
    《亿级流量网站架构核心技术》概要
    Java日志框架:logback详解
    40个Java多线程问题总结
    使用Jenkins部署Spring Boot项目
    spring security 实践 + 源码分析
    Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证
    Spring Boot+redis存储session,满足集群部署、分布式系统的session共享
    maven-assembly-plugin的使用
    使用maven构建多模块项目,分块开发
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/4490663.html
Copyright © 2020-2023  润新知