以前都是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; }