首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

(60分)从sql翻译到oracle的存储过程

2013-03-26 
(60分)求一个从sql翻译到oracle的存储过程。小弟我才转到oracel很不熟悉,有一个存储过程自己修改了部分,但

(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;

热点排行