首先进行包定义,定义存储过程需要返回的游标。
CREATE OR REPLACE  PACKAGE "SPLITRETURN"  is

  
-- Author  : pqzemily
  -- Created : 2007-2-18 21:20:22
  -- Purpose : 
  type Splitlist is REF CURSOR;
end SplitReturn;
分页存储过程
CREATE OR REPLACE  PROCEDURE "SPLITDATA"  
 (
     
----IN------
     -- 传入进行分页的SQL语句
     SqlStr in varchar2,
     
-- 页大小
     pagesize in integer,
     
-- 需要获取的当前页码
     CurrPage in integer,
     
----OUT------
     -- 返回最大页数
     MaxPage out integer,
     
--返回执行后的游标(数据集)
     retunlist out SplitReturn.Splitlist
)
is
   v_splitsql 
varchar2(1000); --正式用来查询的SQL语句
   v_exutteSQL varchar2(1000);--用来存储Select SQL语句中从From开始的以后所有字符
   v_listSizeSQL varchar2(1000);--用来组织获取数据统计SQL
   v_CurrPage int--当前页码
   v_MaxSize int;--最大行
   v_MinLine int--最小行
   v_MaxLine int--最大行
begin
 
--修改SQL语句,插入Rownum字段作为ID
 select SubStr(trim(SqlStr),7,1000into v_exutteSQL from dual;
 v_splitsql:
='select rownum splitID,'||v_exutteSQL;
 
--清空exutteSQL
 v_exutteSQL:='';
 
select SubStr(SqlStr,instr(SqlStr,'from'),1000into v_exutteSQL from dual;
 
--组织新的SQL语句
 v_listSizeSQL:='select count(*)  '||v_exutteSQL; 
 
--执行SQL语句
 execute immediate v_listSizeSQL into v_MaxSize;
 
--取得最大页数 
 MaxPage := ceil(v_MaxSize/pagesize);   
 
--检查当前页码是否符合要求
 if CurrPage>MaxPage then
    v_CurrPage:
=MaxPage;
 
else
     v_CurrPage:
=CurrPage;
 
end if;
 
--取得当前最小行数
 if (v_CurrPage-1>0then
    v_MinLine:
=(v_CurrPage-1)*pagesize;
  
else
    v_MinLine:
=0;
 
end if;
 
--取得当前最大行数
 v_MaxLine:=v_CurrPage*pagesize;
 v_splitsql:
='select * from ('||v_splitsql||') where splitID>'||v_MinLine||' and splitID<='||v_MaxLine;

 
open retunlist for v_splitsql;
 
end SplitData;
注意:传入的SQL语句中不能使用*通配符,如:
Select * from dual;
但可以使用如下类型的SQL语句
select t.* from dual t;
posted on 2007-02-19 09:28  仙岩  阅读(185)  评论(0编辑  收藏  举报