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         }

数据操作层

时间: 2024-10-11 13:37:35

Oracle数据分页,并传出数据集的相关文章

数据分页处理系列之一:Oracle表数据分页检索SQL

  关于Oracle数据分页检索SQL语法,网络上比比皆是,花样繁多,本篇也是笔者本人在网络上搜寻的比较有代表性的语法,绝非本人原创,贴在这里,纯粹是为了让"数据分页专题系列"看起来稍微完整和丰满一些,故先在这里特别声明一下,以免招来骂声一片! 先介绍两个比较有代表性的数据分页检索SQL实例. 无ORDER BY排序的写法.(效率最高) (经过测试,此方法成本最低,只嵌套一层,速度最快!即使检索的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT RO

转Oracle、MySql、SQLServer 数据分页查询

最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句 * firstIndex:其实的索引 * pageSize:每页显示的记录数 */ select o.* from (sql) o limit firstIndex,pageSize

Oracle、MySql、SQLServer 数据分页查询

Oracle.MySql.SQLServer 数据分页查询 摘自:http://www.cnblogs.com/wangyong/p/3396333.html 近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句 * firstIndex:

Oracle、MySql、SQLServer数据分页查询

看过此博文后Oracle.MySql.SQLServer 数据分页查询,在根据公司的RegionRes表格做出了 SQLserver的分页查询语句: SELECT DISTINCT TOP 500 rr.ID AS id ,rr.strName AS name ,rr.nType AS res_type ,rr.nRegID AS region_id ,rr.strChanName AS channel_name ,rr.nChanNum AS channel ,rr.nSortID AS so

Oracle中的数据分页

--数据分页脚本 --创建包含数据分页代码元素声明的包头结构create or replace package data_controlis type type_cursor_data is ref cursor; v_totalline int; --总数据行数 v_totalpage int; --总页数 v_selectsql varchar2(500); --缓存查询语句 --function pagedata(tablename varchar2,currentpage int,lin

转:SQL SERVER数据库中实现快速的数据提取和数据分页

探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo].[TGongwen] (    --TGongwen是红头文件表名 [Gid] [int] IDENTITY (1, 1) NOT NULL , --本表的id号,也是主键 [title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,  --红头文件

ThinkPHP数据分页Page.class.php

获取分页类 ThinkPHP提供了数据分页的扩展类库Page,可以在http://www.thinkphp.cn/extend/241.html下载,或者下载官方的完整扩展包(http://www.thinkphp.cn/down/253.html)里面也已经包含分页扩展类了.把解压后的Page.class.php放入ThinkPHP/Extend/Library/ORG/Util/(如果没有请手动创建)目录下面. 当然,扩展类库的位置其实比较随意,你也可以放入项目的类库目录下面,区别只是在于你

【知了堂学习笔记】JSP页面数据分页实现(一)——分页概念以及主流数据库的分页查询

一.分页简介 1.分页,就是一种将数据库里的数据一部分展示给用户的技术.为什么要这样做呢?因为一般来说用户在查询时数据是非常多的,当一个页面不能显示所有数据时,我们就要对查询的数据进行分页,就像我们的书本分成一页一页一样.最简单的例子就是百度,当你百度时,成千上万的数据,并不是呈现在一个页面的. 2.分页的实现方式 1)假分页(不推荐):什么是假分页呢?假分页就是一次性将数据库里的数据全部取出来,存储在页面中,然后再将数据分别展示出来.这种假分页在数据少的还可以玩玩,当数据多起来的时候,这种方式

Oracle中分页查询语句

Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE