随笔 - 85  文章 - 0  评论 - 7  阅读 - 58935

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;
        }
复制代码

 

posted on   酒歌  阅读(692)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示