首先进行包定义,定义存储过程需要返回的游标。
Select * from dual;
但可以使用如下类型的SQL语句
select t.* from dual t;
CREATE OR REPLACE PACKAGE "SPLITRETURN" is
-- Author : pqzemily
-- Created : 2007-2-18 21:20:22
-- Purpose :
type Splitlist is REF CURSOR;
end SplitReturn;
分页存储过程-- 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,1000) into v_exutteSQL from dual;
v_splitsql:='select rownum splitID,'||v_exutteSQL;
--清空exutteSQL
v_exutteSQL:='';
select SubStr(SqlStr,instr(SqlStr,'from'),1000) into 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>0) then
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语句中不能使用*通配符,如:(
----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,1000) into v_exutteSQL from dual;
v_splitsql:='select rownum splitID,'||v_exutteSQL;
--清空exutteSQL
v_exutteSQL:='';
select SubStr(SqlStr,instr(SqlStr,'from'),1000) into 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>0) then
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;
Select * from dual;
但可以使用如下类型的SQL语句
select t.* from dual t;