(60分)求一个从sql翻译到oracle的存储过程。
小弟我才转到oracel很不熟悉,有一个存储过程自己修改了部分,但是有很多错误,请大虾修改成oracle版,马上给分。
--最通用的分页存储过程
-- 获取指定页的数据
CREATE PROCEDURE Pagination
tableName varchar2(255), -- 表名
strGetFields varchar2(1000) = '* ', -- 需要返回的列
fieldName varchar(255)= ' ', -- 排序的字段名
PageSize int = 10, -- 页尺寸
PageIndex int = 1, -- 页码
doCount bit = 0, -- 返回记录总数, 非 0 值则返回
OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
strWhere varchar2(1500) = ' ' -- 查询条件 (注意 不要加 where)
AS
declare strSQL varchar2(5000) -- 主Sql语句
declare strTmp varchar2(110) -- 临时变量
declare strOrder varchar2(400) -- 排序类型
if doCount <> 0 --如果记录数不为0
begin
if :strWhere <> ' '
set strSQL = 'select count(*) as Total from '+ tableName + ' where '+ strWhere
else
set strSQL = 'select count(*) as Total from '+ tableName + ' '
end
--以上代码的意思是如果 doCount传递过来的不是0,就执行总数统计。以下的所有代码都
--是 doCount为0的情况
else
begin
if OrderType <> 0 --如果@OrderType不是0,就执行降序,这句很重要!
begin
set strTmp = ' <(select min '
set strOrder = ' order by '+ fieldName + ' desc '
end
else
begin
set strTmp = '> (select max '
set strOrder = ' order by '+ fieldName + 'asc '
end
if PageIndex = 1 --如果是第一页就执行以上代码,这样会加快执行速度
begin
if strWhere <> ' '
set strSQL = 'select top ' + str( PageSize) + ' '+ strGetFields+ ' from '+ tableName + ' where ' + strWhere + ' ' + strOrder
else
set strSQL = 'select top ' + str( PageSize) + ' '+ strGetFields+ ' from '+ tableName + ' '+ strOrder
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set strSQL = 'select top ' + str( PageSize) + ' '+ strGetFields+ ' from ' + tableName + ' where ' + fieldName + ' ' + strTmp + '( '+ fieldName + ')
from (select top ' + str(( PageIndex-1)* PageSize) + ' '+ fieldName + ' from '+ tableName + ' ' + strOrder + ') as tblTmp) '+ strOrder
if strWhere <> ' '
set strSQL = 'select top ' + str( PageSize) + ' '+ strGetFields+ ' from '+ tableName + '
where ' + fieldName + ' ' + strTmp + '( '+ fieldName + ')
from (select top ' + str(( PageIndex-1)* PageSize) + ' '+ fieldName + '
from '+ tableName + ' where ' + strWhere + ' ' + strOrder + ') as tblTmp) and ' + strWhere + ' ' + strOrder
end
end
exec ( strSQL)
GO
[解决办法]
我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html
[解决办法]
CREATE PROCEDURE Pagination(
tableName varchar2(255), -- 表名
strGetFields varchar2(1000) := '* ', -- 需要返回的列
fieldName varchar(255):= ' ', -- 排序的字段名
PageSize pls_integer default 10, -- 页尺寸
PageIndex pls_integer default 1, -- 页码
doCount pls_integer default 0, -- 返回记录总数, 非 0 值则返回
OrderType pls_integer default 0, -- 设置排序类型, 非 0 值则降序
strWhere varchar2(1500) default ' ' -- 查询条件 (注意 不要加 where)
)
AS
strSQL varchar2(5000); -- 主Sql语句
strTmp varchar2(110); -- 临时变量
strOrder varchar2(400); -- 排序类型
if doCount <> 0 then--如果记录数不为0
if strWhere <> ' ' then
strSQL := 'select count(*) as Total from '+ tableName + ' where '+ strWhere;
else
strSQL := 'select count(*) as Total from '+ tableName + ' ';
end if;
--以上代码的意思是如果 doCount传递过来的不是0,就执行总数统计。以下的所有代码都
--是 doCount为0的情况
else
if OrderType <> 0 --如果@OrderType不是0,就执行降序,这句很重要!
strTmp := ' <(select min ';
strOrder := ' order by '+ fieldName + ' desc ';
else
strTmp := '> (select max ';
strOrder := ' order by '+ fieldName + 'asc ';
end if;
end if;
if PageIndex = 1 then --如果是第一页就执行以上代码,这样会加快执行速度
if strWhere <> ' ' then
strSQL := 'select top ' + str( PageSize) + ' '+ strGetFields+ ' from '+ tableName + ' where ' + strWhere + ' ' + strOrder;
else
strSQL := 'select top ' + str( PageSize) + ' '+ strGetFields+ ' from '+ tableName + ' '+ strOrder;
end if;
else
--以下代码赋予了@strSQL以真正执行的SQL代码
strSQL := 'select top ' + str( PageSize) + ' '+ strGetFields+ ' from ' + tableName + ' where ' + fieldName + ' ' + strTmp + '( '+ fieldName + ')
from (select top ' + str(( PageIndex-1)* PageSize) + ' '+ fieldName + ' from '+ tableName + ' ' + strOrder + ') as tblTmp) '+ strOrder;
end if;
if strWhere <> ' ' then
strSQL:= 'select top ' + str( PageSize) + ' '+ strGetFields+ ' from '+ tableName + 'where ' + fieldName + ' ' + strTmp + '( '+ fieldName + ')
from (select top ' + str(( PageIndex-1)* PageSize) + ' '+ fieldName + '
from '+ tableName + ' where ' + strWhere + ' ' + strOrder + ') as tblTmp) and ' + strWhere + ' ' + strOrder;
end if;
end Pagination;