1 CREATE OR REPLACE PACKAGE PKG_GETPAGERDATA AS 2 TYPE refCursorType IS REF CURSOR; 3 procedure DL_GETPAGEREDDATA(p_PageSize int, --每页记录数 4 p_PageNo int, --当前页码,从 1 开始 5 p_SqlSelect varchar2, --查询语句,含排序部分 6 p_SqlCount varchar2, --获取记录总数的查询语句 7 p_OutRecordCount out int, --返回总记录数 8 p_OutCursor out refCursorType, --返回结果集 9 res_code out int, --返回成功与否,0成功,1失败 10 res_Result out varchar2 --异常信息或需要返回的信息 11 ); 12 END; 13 14 --PackageBody 15 create or replace package body PKG_GETPAGERDATA is 16 procedure DL_GETPAGEREDDATA --获取分页查询数据存储过程 17 (p_PageSize int, --每页记录数 18 p_PageNo int, --当前页码,从 1 开始 19 p_SqlSelect varchar2, --查询语句,含排序部分 20 p_SqlCount varchar2, --获取记录总数的查询语句 21 p_OutRecordCount out int, --返回总记录数 22 p_OutCursor out refCursorType, --返回结果集 23 res_code out int, --返回成功与否,0成功,1失败 24 res_Result out varchar2 --异常信息或需要返回的信息 25 ) as 26 v_sql varchar2(3000); 27 l_count int; --总记录数 28 l_totalpage int; --总页数 29 l_curpage int; --当前页码 30 l_heiRownum int; 31 l_lowRownum int; 32 v_ProcedureName varchar2(100); 33 begin 34 res_code := 0; 35 --取记录总数 36 v_ProcedureName := '取记录总数'; 37 execute immediate p_SqlCount 38 into l_count; 39 p_OutRecordCount := l_count; 40 l_curpage := p_PageNo; 41 42 l_totalpage := floor(l_count / p_PageSize); 43 if mod(l_count, p_PageSize) != 0 then 44 l_totalpage := l_totalpage + 1; 45 end if; 46 47 if l_totalpage <= 0 then 48 l_totalpage := 1; 49 end if; 50 51 if l_totalpage < p_PageNo then 52 l_curpage := l_totalpage; 53 end if; 54 --执行分页查询 55 v_ProcedureName := '执行分页查询'; 56 l_heiRownum := l_curpage * p_PageSize; 57 l_lowRownum := l_heiRownum - p_PageSize + 1; 58 59 v_sql := 'SELECT * 60 FROM ( 61 SELECT A.*, rownum rn 62 FROM (' || p_SqlSelect || ') A 63 WHERE rownum <= ' || to_char(l_heiRownum) || ' 64 ) B 65 WHERE rn >= ' || to_char(l_lowRownum); 66 67 OPEN p_OutCursor FOR v_sql; 68 res_code := 0; 69 res_Result := ''; 70 Exception 71 when others then 72 res_code := 1; 73 res_Result := v_ProcedureName || '出现异常,' || chr(10) || '异常号:' || 74 sqlcode || '异常信息:' || sqlerrm; 75 rollback; 76 end DL_GETPAGEREDDATA; 77 end PKG_GETPAGERDATA;