这是小弟写在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)
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)
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;
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