Oracle分页存储过程

 

分页存储过程,Package头代码:
create or replace package DB_Oper is

  
-- Author  : DSJ
  -- Created : 2008-2-27 10:22:51
  -- Purpose : 
  
  
-- Public type declarations
  
  
-- Public constant declarations
  --  <ConstantName> constant <Datatype> := <Value>;

  
-- Public variable declarations
  --<VariableName> <Datatype>;

  
-- Public function and procedure declarations
--
  function <FunctionName>(<Parameter> <Datatype>) return <Datatype>;
  type ref_DataSet IS REF CURSOR;
  
function GetCount(mTableName varchar2, mTerm varchar2return number;
  
procedure return_DataSet(
     mTableName 
in varchar2,    --表名
     mTerm in varchar2,         --条件
     mPageSize in number,       --每页显示记录数
     mPageIndex in number,      --当前页
     mOrderField in varchar2,   --排序字段
     mOrderStyle in number,    --排序方式 0 升序 1 降序
     mTotalRecords out number,  --总记录数
--
     mSql out varchar2--, 
     mDateSet out ref_DataSet    --记录
     );
end DB_Oper;

 Package体代码:

create or replace package body DB_Oper is

  
-----  获取记录数  ------ 
  function GetCount(mTableName varchar2, mTerm varchar2return number is
    i 
number;
    vSql 
varchar2(1000);
  
begin
    i :
= 0;
    vSql :
= 'select count(*)  from ' || mTableName ;
    
    
if length(mTerm) > 0 then
      vSql :
= vSql || ' where ' || mTerm;
    
end if;
    
    
execute IMMEDIATE  vSql into i;
     
    
return(i);
  
end;
  
  
-----  数据分页  ----------
  procedure return_DataSet(
     mTableName 
in varchar2,    --表名
     mTerm in varchar2,         --条件
     mPageSize in number,       --每页显示记录数
     mPageIndex in number,      --当前页
     mOrderField in varchar2,   --排序字段
     mOrderStyle in number,    --排序方式  0 升序 1 降序
     mTotalRecords out number,  --总记录数
--
     mSql out varchar2,
     mDateSet out ref_DataSet    --记录集
     ) is
  
begin
    
declare
      Invalid_Input Exception;
      vSql 
varchar2(1000);
      Start_page 
number;
      End_page 
number;
      n_PageIndex 
number;
      n_PageSize 
number;
    
begin
      mTotalRecords :
= GetCount(trim(mTableName), trim(mTerm));
      vSql :
= 'select * from ' || mTableName;
      
if length(trim(mTerm)) > 0 then
        vSql :
= vSql || ' where ' || trim(mTerm) ;
      
end if;
      
if length(trim(mOrderField)) > 0 then
       
begin
          vSql :
= vSql || ' order by ' || trim(mOrderField);
          
if morderStyle > 0 then
            vSql :
= vSql || ' desc '
          
end if;
       
end;
      
end if;
      
      
--
      n_PageSize := mPageSize;
      
if mPageSize <= 0 then
        n_PageSize :
= 10;
      
end if;
      n_PageIndex :
= mPageIndex;
      
if mPageIndex <= 0 then
        n_PageIndex :
= 1;
      
end if;  
      
if mTotalRecords > 0 and n_PageIndex > 1 then
      
begin
            --如果n_pageindex大于实际的页数,则取实际页数
        
if n_PageIndex > round((mTotalRecords / n_PageSize) + 0.5) then
          n_PageIndex :
= round((mTotalRecords / n_PageSize) + 0.5);
        
end if;
      
end;
      
end if
      Start_page :
= (n_PageIndex - 1* n_PageSize + 1;
      End_page :
= n_PageIndex * n_PageSize;
      vSql :
= 'SELECT * FROM (SELECT A.*, rownum r FROM ( ' || vSql || ' ) A WHERE rownum <= ' || End_page || ' ) B WHERE r >= '|| Start_page;
--     vSql := 'SELECT * FROM (SELECT A.*, rownum r FROM ( select * from User_info where user_no like ''0000514268%'' order by user_no desc  ) A WHERE rownum <= 10 ) B WHERE r >= 1';
--
      Dbms_Output.put_line(vSql);
--
      mSql := vSql ;
     
      
Open mDateSet for vSql;

    exception
      
When Invalid_Input Then
        
open mDateSet for select null from dual;
    
end
--    DBMs_output.put_line(mTotalRecords);   
    
  
end return_DataSet;
end DB_Oper;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值