这是小弟写在SQL里的一个存储过程,关于分页的,请问高手们怎样转成ORACLE呢?ORACLE不太熟悉,呵呵,请帮帮小弟吧。ORACLE自增ID通过序列,触发器就把小弟弄得够呛了。现存储过程又难道我了。以下是SQL里的存储过程
ALTER procedure [dbo].[GetRecordFromPage]
(
@startIndex varchar(18),--记录上限
@endIndex varchar(18),--记录下限
@tableName varchar(50),--表名,如 news_list
@idField varchar(20),--ID字段,此字段是关键字段
@dataField varchar(500),--字段名,如 menu_id,name,也可以*
@orderBy varchar(200),--排序,如order by id desc,不排序可以为空
@searchWhere varchar(5000)--查询条件,不需要where,如 and menu_id='5'
)
as
declare @sql_str varchar(6000)
--创建临时表
CREATE TABLE #indextable
(
  IndexId int identity(1,1) NOT NULL,
  nid int
)
set @sql_str = 'insert into #indextable(nid) select top ' +  @endIndex + @idField+' from '+@tableName+' where 1=1 '+ @searchWhere + @orderBy
exec(@sql_str)
begin
select @sql_str = 'select '+ @dataField+' from '+ @tableName+' A 
inner join #indextable B on A.'+@idField+'=B.nid 
where B.IndexId between '+ @startIndex +' and ' +@endIndex +'order by B.IndexId '
end
exec(@sql_str)

解决方案 »

  1.   

    --试着帮你改改,对SqlServer不太熟悉
    create or replace procedure GetRecordFromPage
    (
    startIndex varchar2(18),--记录上限
    endIndex varchar2(18),--记录下限
    tableName varchar2(50),--表名,如 news_list
    idField varchar2(20),--ID字段,此字段是关键字段
    dataField varchar2(500),--字段名,如 menu_id,name,也可以*
    orderBy varchar2(200),--排序,如order by id desc,不排序可以为空
    searchWhere varchar2(5000)--查询条件,不需要where,如 and menu_id='5'
    )
    as
    sql_str varchar(6000);
    /* 这个可以在线创建
    --创建临时表
    CREATE TABLE indextable
    (
      IndexId int identity(1,1) NOT NULL,
      nid int
    )
    */
    begin
    sql_str := 'insert into indextable(nid) select  '||idField||' from '||tableName||' where 1=1 and '||searchWhere ||'rownum<='||endIndex;execute immediate sql_str;sql_str := 'select '||dataField||' from '||tableName||' A  
    inner join indextable B on A.'||idField||'=B.nid  
    where B.IndexId between '||startIndex||' and '||endIndex||'order by B.IndexId ';execute immediate sql_str;
    end;
      

  2.   

    大概思路:
    1、varchar改成varchar2
    2、oracle第一变量不要@ 
    3、oracle没有top 可以用rownum 例如:select * from emp where rownum<=10
    4、拼接用||不是+
    5、存储过程的格式大致是
      create or replace procedure procedurename(...) 
      as ... 
      begin ...end; 每个语句结束要用;
    6、执行ddl语句用execute immediate
      

  3.   

    好勒,谢谢您,大哥。我先研究看看吧,对了临时表应该怎样弄呢?在SQL里临时表并不是建好的表,是临时产生的,存储过程结束后自动消失,但ORACLE里貌似不好弄吧。
      

  4.   

    貌似可以了,web_menu为 表名,我这个存储过程的目的就是分页查询时只取某个阶段数据,如下语句方式貌似可以实现,这样就不需要临时表了,存储过程就写好语句把查询条件以及表记录上下限传进去就行,只不知道效率如何,rownum 觉得还比较适用select * from (select rownum rm,Web_Menu.* from Web_Menu where parent_id=0 order by order_id asc) where rm>=2 and rm<=6
      

  5.   

    zhuomingwang ,还在吗?我 这种写法,数据量大效率有问题吗 ?