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; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!