|
|
CREATE OR REPLACE PACKAGE PKG_GETPAGERDATA AS
TYPE refCursorType IS REF CURSOR;
procedure DL_GETPAGEREDDATA(p_PageSize int, --每页记录数
p_PageNo int, --当前页码,从 1 开始
p_SqlSelect varchar2, --查询语句,含排序部分
p_SqlCount varchar2, --获取记录总数的查询语句
p_OutRecordCount out int, --返回总记录数
p_OutCursor out refCursorType, --返回结果集
res_code out int, --返回成功与否,0成功,1失败
res_Result out varchar2 --异常信息或需要返回的信息
);
END;
--PackageBody
create or replace package body PKG_GETPAGERDATA is
procedure DL_GETPAGEREDDATA --获取分页查询数据存储过程
(p_PageSize int, --每页记录数
p_PageNo int, --当前页码,从 1 开始
p_SqlSelect varchar2, --查询语句,含排序部分
p_SqlCount varchar2, --获取记录总数的查询语句
p_OutRecordCount out int, --返回总记录数
p_OutCursor out refCursorType, --返回结果集
res_code out int, --返回成功与否,0成功,1失败
res_Result out varchar2 --异常信息或需要返回的信息
) as
v_sql varchar2(3000);
l_count int; --总记录数
l_totalpage int; --总页数
l_curpage int; --当前页码
l_heiRownum int;
l_lowRownum int;
v_ProcedureName varchar2(100);
begin
res_code := 0;
--取记录总数
v_ProcedureName := '取记录总数';
execute immediate p_SqlCount
into l_count;
p_OutRecordCount := l_count;
l_curpage := p_PageNo;
l_totalpage := floor(l_count / p_PageSize);
if mod(l_count, p_PageSize) != 0 then
l_totalpage := l_totalpage + 1;
end if;
if l_totalpage <= 0 then
l_totalpage := 1;
end if;
if l_totalpage < p_PageNo then
l_curpage := l_totalpage;
end if;
--执行分页查询
v_ProcedureName := '执行分页查询';
l_heiRownum := l_curpage * p_PageSize;
l_lowRownum := l_heiRownum - p_PageSize + 1;
v_sql := 'SELECT *
FROM (
SELECT A.*, rownum rn
FROM (' || p_SqlSelect || ') A
WHERE rownum <= ' || to_char(l_heiRownum) || '
) B
WHERE rn >= ' || to_char(l_lowRownum);
OPEN p_OutCursor FOR v_sql;
res_code := 0;
res_Result := '';
Exception
when others then
res_code := 1;
res_Result := v_ProcedureName || '出现异常,' || chr(10) || '异常号:' ||
sqlcode || '异常信息:' || sqlerrm;
rollback;
end DL_GETPAGEREDDATA;
end PKG_GETPAGERDATA;
|
|
|