下面是李天平的分页存储过程,求高手帮忙给转成oracle的可以吗?
只需要保证 存储过程名称、接收的参数、返回的内容一致就行,这样的话,我的原来的程序就不用改了
因为现在的项目要保证同时支持oracle 和SQL,所以我想这样的话,就不用动程序了
如果分不够的话,再加分啊。------------------------------------
--用途:支持任意排序的分页存储过程  
--说明:
------------------------------------
ALTER PROCEDURE [dbo].[UP_GetRecordByPageOrder]
 
 @tblName varchar(255),   -- 表名 
 @fldName varchar(255),   -- 显示字段名 
 @OrderfldName varchar(255),  -- 排序字段名 
 @StatfldName varchar(255),  -- 统计字段名 
 @PageSize int = 10,   -- 页尺寸 
 @PageIndex int = 1,   -- 页码 
 @IsReCount bit = 0,   -- 返回记录总数, 非 0 值则返回 
 @OrderType bit = 0,   -- 设置排序类型, 非 0 值则降序 
 @strWhere varchar(1000) = ''  -- 查询条件 (注意: 不要加 where) 
AS  declare @strSQL varchar(6000)  -- 主语句 
 declare @strTmp varchar(1000)   -- 临时变量 
 declare @strOrder varchar(1000)  -- 排序类型 if @OrderType != 0 
 begin 
  set @strTmp = '<(select min' 
  set @strOrder = ' order by [' + @OrderfldName +'] desc' 
 end 
else 
 begin 
  set @strTmp = '>(select max' 
  set @strOrder = ' order by [' + @OrderfldName +'] asc' 
 end set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 
 + @tblName + '] where [' + @OrderfldName + ']' + @strTmp + '([' 
 + @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
 + @OrderfldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 
 + @strOrder if @strWhere != '' 
 set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 
 + @tblName + '] where [' + @OrderfldName + ']' + @strTmp + '([' 
 + @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
 + @OrderfldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 
 + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder if @PageIndex = 1 
 begin 
  set @strTmp = '' 
  if @strWhere != '' 
  set @strTmp = ' where ' + @strWhere   set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 
  + @tblName + ']' + @strTmp + ' ' + @strOrder 
 end 
if @IsReCount != 0 
set @strSQL = @strSQL+' select count(1) as Total from [' + @tblName + ']'if @strWhere!=''
set @strSQL = @strSQL+' where ' + @strWhereprint @strSQL
exec (@strSQL)

解决方案 »

  1.   

    呵呵,谢谢了啊
    这个是李天平写的分页,不知道你了解过吗?    /// <summary>
        /// 获取某机构下的所有管理员列表
        /// </summary>
        public DataTable GetList(string strWhere, int pageSize, int pageIndex, ref int recordCount)
        {
            SqlParameter[] parameters = {
    new SqlParameter("@tblName", SqlDbType.VarChar, 255),
    new SqlParameter("@fldName", SqlDbType.VarChar, 255),
                        new SqlParameter("@OrderfldName",SqlDbType.VarChar,255),
                        new SqlParameter("@StatfldName",SqlDbType.VarChar,255),
    new SqlParameter("@PageSize", SqlDbType.Int),
    new SqlParameter("@PageIndex", SqlDbType.Int),
    new SqlParameter("@IsReCount", SqlDbType.Bit),
    new SqlParameter("@OrderType", SqlDbType.Bit),
    new SqlParameter("@strWhere", SqlDbType.VarChar,1000),
    };
            parameters[0].Value = "view_adminUser";
            parameters[1].Value = "*";
            parameters[2].Value = "adminName";
            parameters[3].Value = "*";
            parameters[4].Value = pageSize;
            parameters[5].Value = pageIndex;
            parameters[6].Value = 1;
            parameters[7].Value = 0;
            parameters[8].Value = strWhere;
            DataSet ds = DbHelperSQL.RunProcedure("UP_GetRecordByPageOrder", parameters, "ds");
            recordCount = Convert.ToInt32(ds.Tables[1].Rows[0]["Total"].ToString());
            return ds.Tables[0];这是我调用的方法,麻烦了
      

  2.   

    ORACLE有现成的分页存储过程是用ROWNUM实现,为什么一定要把SQL Server的实现方式转换成ORACLE的呢:http://ghd258.cnblogs.com/archive/2006/03/25/358818.aspx
      

  3.   

      procedure sp_Page(p_PageSize int,          --每页记录数
                      p_PageNo int,            --当前页码,从 1 开始
                      p_SqlSelect varchar2,    --查询语句,含排序部分
                      p_SqlCount varchar2,     --获取记录总数的查询语句
                      p_OutRecordCount out int,--返回总记录数
                      p_OutCursor out sys_refcursor)
      as
          v_sql varchar2(3000);
          v_count int;
          v_heiRownum int;
          v_lowRownum int;
      begin
        ----取记录总数
        execute immediate p_SqlCount into v_count;
        p_OutRecordCount := v_count;
        ----执行分页查询
        v_heiRownum := p_PageNo * p_PageSize;
        v_lowRownum := v_heiRownum - p_PageSize +1;    v_sql := 'SELECT *
                  FROM (
                        SELECT A.*, rownum rn
                        FROM  ('|| p_SqlSelect ||') A
                        WHERE rownum <= '|| to_char(v_heiRownum) || '
                       ) B
                  WHERE rn >= ' || to_char(v_lowRownum) ;
                  --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn    OPEN p_OutCursor FOR  v_sql;
      

  4.   

    不改你的代码,想仅仅改变存储过程就移植到oracle,是不可能的。!!!!!!!!!!!!!!!!!!!!!!