Oracle 分页查询存储过程

以前都是sql数据库 分页存储过程很多也很简单 后来接触Oracle 忒伤了 好多不同的关键字 不同的代码编写方式及定义等

也曾上网查了好多Oracle数据库分页存储过程 由于接触时间较短所以 几乎看不明白 今天自己终于弄明白了 

CREATE OR REPLACE  PACKAGE DotNet  is
  TYPE type_cur IS REF CURSOR;     --定义游标变量用于返回记录集
  PROCEDURE DotNetPagination
  (
  Pindex in number,                --分页索引
  Pname in varchar2,          --要查找的表名 如需连表查询则创建连表查询视图 此处可写视图名称 也可以是查询出一张虚拟表的sql语句
  Psql in varchar2,                --要查找数据的条件 and开头
  Psize in number,                 --页面大小 每页要显示的数据量
  Pcount out number,               --返回数据总数
  v_cur out type_cur               --返回当前页数据记录
  );
  end DotNet;
CREATE OR REPLACE  PACKAGE BODY DotNet  is
  PROCEDURE DotNetPagination
  (
  Pindex in number,                --分页索引
  Pname in varchar2,          --要查找的表名 如需连表查询则创建连表查询视图 也可以是查询出一张虚拟表的sql语句
  Psql in varchar2,                --要查找数据的条件 and开头
  Psize in number,                 --页面大小 每页要查询的数据量
  Pcount out number,               --返回数据总数
  v_cur out type_cur               --返回当前页数据记录
  )
  AS
  v_sqls varchar2(500);--完整的分页查询语句
  v_count number;--数据总记录数
  v_Plow number;--要查询的分页数据的结束下表
  v_Phei number;--要查询的分页数据 起始下表
  v_sql varchar2(500);--查询对象的sql语句
  Begin

  v_Phei := Pindex * Psize + Psize;
  v_Plow := v_Phei - Psize + 1;
  v_sql := 'select rownum rn,t.* from( ' || Pname || ') t where 1=1 '||Psql;   
      --v_sql := 'select rownum rn,t.* from WARD_INFO t where 1=1' ||Psql;     
    ------------------------------------------------------------取所有数据总数
  v_sqls := 'select count(*) from (' || v_sql || ')';
  execute immediate v_sqls into v_count;
  --Pcount := ceil(v_count/Psize);
  Pcount:=v_count;
    ------------------------------------------------------------显示任意页内容
  v_sqls := 'select * from (' || v_sql || ') where rn between ' || v_Plow || ' and ' || v_Phei ;
  open v_cur for v_sqls;
  End DotNetPagination;
end DotNet;

网上看到好多 写2个存储过程的 刚开始还以为 很NB的样子 后来才知道 都是不懂乱学的 一群复制党  

下面是c#调用存储过程代码

 /// <summary>
        /// 分页查询存储过程
        /// </summary>
        /// <param name="conStr">数据库连接字符串</param>
        /// <param name="ptableName">要查找数据的目标表</param>
        /// <param name="psql">查找条件即where 的后续条件 and开头</param>
        /// <param name="pindex">当前页码</param>
        /// <param name="psize">每页显示数量</param>
        /// <param name="pcount">输出参数总数据量</param>
        /// <param name="dt">输出参数当前页数据内容</param>
        /// <returns></returns>
        public static bool gridbind(string conStr, string ptableName, string psql, int pindex, int psize, out string pcount,out DataTable dt)
        {
            OracleConnection conn = new OracleConnection(conStr);
            OracleCommand cmd = new OracleCommand();
            OracleDataAdapter oda = new OracleDataAdapter();
          
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            conn.Open();
            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("Pname", OracleType.VarChar).Value = ptableName;
            cmd.Parameters.Add("v_cur", OracleType.Cursor).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("Pcount", OracleType.Number).Direction = ParameterDirection.Output;
            oda.SelectCommand = cmd;
            try
            {
                dt = new DataTable();
                oda.Fill(dt);
                pcount = cmd.Parameters["Pcount"].Value.ToString();
            }
            catch (Exception)
            {
                pcount = string.Empty;
                dt = null;
                return false;
            }
            finally 
            {
                conn.Close();
            }
            return true;
        }
原文地址:https://www.cnblogs.com/Iyce/p/3252767.html