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         }
数据操作层

 

你可能感兴趣的:(oracle)