CREATE PROCEDURE [dbo].[sp_paging] (
@Tname varchar(255),/*表名*/
@kname varchar(255),/*主键名*/
@columns varchar(500),/*select的列名*/
@whereText varChar(1000),/*查询条件*/
@orderText varChar(100),/*排序条件*/
@startIndex int,/*取的数目开始值*/
@endIndex int/*取的数目的结束值*/
)
AS
BEGIN
SET NOCOUNT ON;
declare @sqlstring varchar(1500)
set rowcount @endIndex
DECLARE @tableid varchar(20)
DECLARE @idType varchar(20)
select @tableid=id   from sysobjects where name=@Tname
select @idType=xtype from sysColumns where id=@tableid and LOWER(name)='id'
/*如果主键Id为varchar时,则临时表的nid为varchar,否则为int*/
if @idType='167'
begin
/*得到一张有顺序Id的临时表,用户分页*/
select @sqlstring = 'declare @indextable table(id int identity(1,1),nid varchar(50))
insert into @indextable(nid) 
select '+@kname+' from '+@Tname+' where '+@whereText+' order by '+@orderText  
+' select '+@columns+' from '+@Tname+' t, @indextable o where t.'+@kname+' =o.nid 
and o.id between '+convert(varchar,@startIndex)  
+' and  '+convert(varchar,@endIndex) +' order by o.id'
end
else
begin
select @sqlstring = 'declare @indextable table(id int identity(1,1),nid int)
insert into @indextable(nid) 
select '+@kname+' from '+@Tname+' where '+@whereText+' order by '+@orderText  
+' select '+@columns+' from '+@Tname+' t, @indextable o where t.'+@kname+' =o.nid 
and o.id between '+convert(varchar,@startIndex)  
+' and  '+convert(varchar,@endIndex) +' order by o.id'
end
exec(@sqlstring) SET NOCOUNT OFF;
END

解决方案 »

  1.   

    这个你最好自己根据你逻辑来改吧,给你点建议:
    1、注意语法的不同
    2、函数不同,即有可能是Oracle没有的
      

  2.   

    主要oracle基本没搞过,现在有个系统迁移,所以先求助了
      

  3.   

    2个的差别还是很大的,你还是自己先看看oracle的存储过程的写法,然后自己写吧
      

  4.   

    CREATE PROCEDURE sp_paging (
                                c_Tname varchar2,--/*表名*/
                                c_kname varchar2,--/*主键列名*/
                                c_columns varchar2,--/*select的列名*/
                                c_indextable varchar2,
                                c_whereText varChar,--/*查询条件*/
                                c_orderText varChar,--/*排序条件*/
                                c_startIndex number,--/*取的数目开始值*/
                                c_endIndex number, --/*取的数目的结束值*/
                                C_CUR SYS_REFCURSOR --返回结果集
    )
    AS
    c_sqlstring varchar2(1500);
    c_tableid varchar2(20);
    c_idType varchar2(20);
    BEGIN
    select data_type into c_idType  from all_tab_columns where table_name=c_Tname and LOWER(name)='id'
    /*如果主键Id为varchar时,则临时表的nid为varchar,否则为int*/
    if c_idType='VARCHAR2' or c_idType='VARCHAR' or c_idType='CHAR' or c_idType='NUMBER' then
    c_sqlstring:='select '||c_kname' from '||c_Tname||' where '||c_whereText||' order by '||c_orderText   
    ||' union all select cname from (select '||c_columns||' cname,row_number() over(order by 1) rn from '||c_Tname||') where
    rn betwen '||c_startIndex||' and '||c_endIndex ;
    END IF;
    open C_CUR for c_sqlstring;
    end;