//////////////////////////////////////////oracle部分存储过程
create or replace package PACK_PAGE is
TYPE type_cur IS REF CURSOR; --定义游标变量用于返回记录集
PROCEDURE PROC_PAGE
(
Pindex in number, --分页索引
Psql in varchar2, --产生dataset的sql语句
Psize in number, --页面大小
Pcount out number, --返回分页总数
v_cur out type_cur --返回当前页数据记录
);
procedure PROC_PAGECOUNT
(
Psqlcount in varchar2, --产生dataset的sql语句
Prcount out number --返回记录总数
);
end PACK_PAGE;
///////////////////////////////////////////////////////
create or replace package body PACK_PAGE is
PROCEDURE PROC_PAGE
(
Pindex in number,
Psql in varchar2,
Psize in number,
Pcount out number,
v_cur out type_cur
)
AS
v_sql VARCHAR2(5000);
v_tempSql varchar2(5000);
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-1) * Psize + Psize;
v_Plow := v_Phei - Psize + 1;
v_tempSql := 'select rownum rn,t.* from ('|| Psql ||')t Where rownum <= ' || v_Phei ; --要求必须包含rownum字段
v_sql := 'select * from (' || v_tempSql || ') where rn between ' || v_Plow || ' and ' || v_Phei ;
open v_cur for v_sql;
End PROC_PAGE;
--**************************************************************************************
procedure PROC_PAGECOUNT
(
Psqlcount in varchar2,
Prcount out number
)
as
v_sql varchar2(5000);
v_prcount number;
begin
v_sql := 'select count(*) from (' || Psqlcount || ')';
execute immediate v_sql into v_prcount;
Prcount := v_prcount; --返回记录总数
end PROC_PAGECOUNT;
--**************************************************************************************
end PACK_PAGE;
////////////////////// c# 调用
/// <summary>
/// 分页条件查询
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">每页包含的记录数</param>
/// <param name="tabName">填充数据集时的表名称</param>
/// <returns></returns>
public DataSet QueryByPage(string sql, int pageIndex, int pageSize, string tabName)
{
using (OracleHelper orahp = new OracleHelper())
{
DataSet ds = new DataSet();
ds.Tables.Add(new DataTable(tabName));
orahp.Open();
orahp.ExecuteSP_Page(ds.Tables[tabName], "pack_page.proc_page", sql, pageIndex, pageSize, true);
orahp.Close();
return ds;
}
}
public int ExecuteSP_Page(DataTable outDataTable, string procName, string sql, int pageIndex, int pageSize, bool setCase)
{
if (null == connection)
{
throw new ObjectDisposedException(GetType().FullName);
}
int nReturn = 0;
using (OracleCommand command = new OracleCommand(procName, connection))
{
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = this._timeout;
command.Parameters.Add("psql", OracleType.VarChar).Value = sql;
command.Parameters.Add("pindex", OracleType.Number).Value = pageIndex;
command.Parameters.Add("psize", OracleType.Number).Value = pageSize;
command.Parameters.Add("pcount", OracleType.Number).Direction = ParameterDirection.Output;
command.Parameters.Add("v_cur", OracleType.Cursor).Direction = ParameterDirection.Output;
if (null != transaction)
{
command.Transaction = transaction;
}
using (OracleDataAdapter oracAdapter = new OracleDataAdapter(command))
{
if (setCase) outDataTable.CaseSensitive = true;
nReturn = oracAdapter.Fill(outDataTable);
}
command.Parameters.Clear();
return nReturn;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构