六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 1439|回复: 0

oracle数据库分页存储过程

[复制链接]
 楼主| 发表于 2012-6-21 13:33:06 | 显示全部楼层 |阅读模式
1、oracle数据库分页存储过程
CREATE OR REPLACE  PACKAGE DotNet  is

  TYPE type_cur IS REF CURSOR;     --定义游标变量用于返回记录集
  PROCEDURE DotNetPagination
  (
  Pindex in number,                --分页索引
  Psql in varchar2,                --产生dataset的sql语句
  Psize in number,                 --页面大小
  Pcount out number,               --返回分页总数
  v_cur out type_cur               --返回当前页数据记录
  );
  procedure DotNetPageRecordsCount
  (
  Psqlcount in varchar2,           --产生dataset的sql语句
  Prcount   out number             --返回记录总数
  );
end DotNet;
CREATE OR REPLACE  PACKAGE BODY DotNet"  is
--***************************************************************************************
  PROCEDURE DotNetPagination
  (
  Pindex in number,
  Psql in varchar2,
  Psize in number,
  Pcount out number,
  v_cur out type_cur
  )
  AS
  v_sql VARCHAR2(1000);
  v_count number;
  v_Plow number;
  v_Phei number;
  Begin
  ------------------------------------------------------------取分页总数
  v_sql := 'select count(*) from (' || Psql || ')';
  execute immediate v_sql into v_count;
  Pcount := ceil(v_count/Psize);
  ------------------------------------------------------------显示任意页内容
  v_Phei := Pindex * Psize + Psize;
  v_Plow := v_Phei - Psize + 1;
  --Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必须包含rownum字段
  v_sql := 'select * from (' || Psql || ') where rn between ' || v_Plow || ' and ' || v_Phei ;
  open v_cur for v_sql;
  End DotNetPagination;
--**************************************************************************************
  procedure DotNetPageRecordsCount
  (
  Psqlcount in varchar2,
  Prcount   out number
  )
  as
  v_sql varchar2(1000);
  v_prcount number;
  begin
  v_sql := 'select count(*) from (' || Psqlcount || ')';
  execute immediate v_sql into v_prcount;
  Prcount := v_prcount;                  --返回记录总数
  end DotNetPageRecordsCount;
--**************************************************************************************
end DotNet;
2、使用示例
       /// <summary>
       /// 填充dataSet数据集-Oracle库
       /// </summary>
       /// <param name="pindex">当前页</param>
       /// <param name="psql">执行查询的SQL语句</param>
       /// <param name="psize">每页显示的记录数</param>
       /// <returns></returns>
      private bool gridbind(int pindex, string psql, int psize)
     {
            OracleConnection conn = new OracleConnection();
            OracleCommand cmd = new OracleCommand();
            OracleDataAdapter dr = new OracleDataAdapter();
            conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            conn.Open();
            cmd.CommandText = "DotNet.DotNetPageRecordsCount";
            cmd.Parameters.Add("psqlcount", OracleType.VarChar).Value = psql;
            cmd.Parameters.Add("prcount", OracleType.Number).Direction = ParameterDirection.Output;
           
            cmd.ExecuteNonQuery();
            string PCount = cmd.Parameters["prcount"].Value.ToString();
            cmd.Parameters.Clear();
            cmd.CommandText = "DotNet.DotNetPagination";
            if (pindex != 0)
            {
                cmd.Parameters.Add("pindex", OracleType.Number).Value = pindex - 1;
            }
            else
            {
                cmd.Parameters.Add("pindex", OracleType.Number).Value = pindex;
            }
            cmd.Parameters.Add("psql", OracleType.VarChar).Value = psql;
            cmd.Parameters.Add("psize", OracleType.Number).Value = psize;
            cmd.Parameters.Add("v_cur", OracleType.Cursor).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("pcount", OracleType.Number).Direction = ParameterDirection.Output;
            dr.SelectCommand = cmd;
            try
            {
                ds = new DataSet();
                dr.Fill(ds);
                //显示页码条的状态
                showStatus(Convert.ToInt32(cmd.Parameters["pindex"].Value) + 1,
                    Convert.ToInt32(cmd.Parameters["pcount"].Value),
                    Convert.ToInt32(PCount));
                for (int i = 0; i < ds.Tables.Count; i++)
                { //把数据行为零的表删除
                    if (ds.Tables.Rows.Count == 0)
                        ds.Tables.Remove(ds.Tables.TableName);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }

            conn.Close();
            return true;
      }

本文摘自:http://blog.sina.com.cn/s/blog_572dad3301000b4c.html
该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表