oracle 分页存储过程

--数据库创建存储过程包

create or replace package DotNet is
  type type_cur is ref  cursor; --定义游标变量用于返回记录集
  procedure DotNetPagination(Pindex in number, --分页索引
                                 Psql   in varchar2, --产生dataset的sql语句
                                 Psize  in number, --页面大小
                                 v_cur  out type_cur --返回当前页数据记录
                                 );
  procedure DotNetPageRecordsCount(Psqlcount in varchar2, --产生dataset的sql语句
                                       Prcount   out number --返回记录总数
                                       );
end DotNet;

 

create or replace package body DotNet is
procedure DotNetPagination(Pindex in number,
                             Psql   in varchar2,
                             Psize  in number,
                             v_cur  out type_cur) AS
    v_sql    VARCHAR2(4000);
    v_count  number;
    v_Plow   number;
    v_Phei   number;
    v_Appsql varchar2(1000);
  Begin
    v_Phei   := Pindex * Psize + Psize;
    v_Plow   := v_Phei - Psize + 1;

    v_Appsql := '';
    if (Pindex < 1000) then
      v_Appsql := ' where rownum <= ' || v_Phei;
    end if;  
    --v_sql select rownum as rn,t1.* from " + tableName + " t1 ;要求必须包括rownum字段
    v_sql := 'select * from (' || Psql || v_Appsql || ') where rn between ' || v_Plow || ' and ' || v_Phei;

    open v_cur for v_sql;
  End DotNetPagination;
  procedure DotNetPageRecordsCount(Psqlcount in varchar2,
                                   Prcount   out number) as
    v_sql     varchar2(4000);
    v_prcount number;
  begin
    v_sql := 'select count(*) from (' || Psqlcount || ')';
    execute immediate v_sql
      into v_prcount;
    Prcount := v_prcount;
  end DotNetPageRecordsCount;
end DotNet;

 

--C#用Oracle.DataAccess调用

DataTable dt = new DataTable();
   dt.TableName = tableName;
   IDataAccess da = IVDBConnect.Instance.GetDataAccess();
   IDbConnection conn = da.GetConnection;
   OracleCommand command = new OracleCommand();
   command.Connection = (OracleConnection)conn;
   //command.CommandType = CommandType.StoredProcedure;
   command.CommandText = "begin DotNet.DotNetPagination(:Pindex,:Psql,:Psize,:v_cur);end;";
   OracleParameter p1 = new OracleParameter("Pindex", OracleDbType.Decimal);
   p1.Direction = ParameterDirection.Input;
   p1.Value = Pindex;
   command.Parameters.Add(p1);
   OracleParameter p2 = new OracleParameter("Psql", OracleDbType.Varchar2);
   p2.Direction = ParameterDirection.Input;
   p2.Value = @" select rownum as rn,t1.* from " + tableName + " t1 ";
   command.Parameters.Add(p2);
   OracleParameter p3 = new OracleParameter("Psize", OracleDbType.Decimal);
   p3.Direction = ParameterDirection.Input;
   p3.Value = Psize;
   command.Parameters.Add(p3);
   OracleParameter p4 = new OracleParameter("v_cur", OracleDbType.RefCursor);
   p4.Direction = ParameterDirection.ReturnValue;
   command.Parameters.Add(p4);
   try
   {
    command.Connection.Open();
    //IDbTransaction trans = conn.BeginTransaction();
    //command.Transaction = trans;
    command.ExecuteNonQuery();
    //command.Transaction.Commit();
    OracleDataAdapter dap = new OracleDataAdapter(command);
    dap.Fill(dt);

   }
   catch (Exception ex)
   {
    AppLog.Log("分页查询失败!" + ex.Message + "\n\r" + ex.StackTrace, AppLog.LogType.Error);
    throw ex;
   }
   finally
   {
    command.Connection.Close();
   }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值