CREATE OR REPLACE PACKAGE BODY pkg_test AS --高效分页函数 function prc_querys ( p_tableName in varchar2, --表名 p_tableColum in varchar2, --表列 p_strwhere in varchar2, --查询条件 格式:where ...group by ... order by ... p_curPage in out Number, --当前页 p_pageSize in out Number, --每页显示记录的条数 p_totalRecords out Number, --总记录数 p_totalPages out Number -- 总页数 ) return pkg_test.myrctype --返回查询满足的结果集 IS myrctypes pkg_test.myrctype; v_sql varchar2(2000):=''; --sql语句 v_startRecord Number; --开始显示的记录数 v_endRecord Number; --结束显示的记录条数 p_table_true VARCHAR2(8); --判断是存在该表 BEGIN --记录总记录条数 begin select max(1) into p_table_true from user_all_tables ust whereust.table_name=upper(trim(p_tableName)); if trim(p_table_true) is not null then --验证该存储过程数据参数 if (instr(upper(trim(p_strwhere)),'WHERE',1,1) = 0) and (instr(upper(trim(p_strwhere)),';',1,1) =0) and (trim(p_pageSize)>='1') then v_sql:='select count(*) FROM '|| trim(p_tableName) ||' where '||trim(p_strwhere); execute IMMEDIATE v_sql INTO p_totalRecords; IF MOD(p_totalRecords,p_pageSize)=0 THEN --得到整数月则直接取得到的页码数否在原来的基础上增加一个页码 p_totalPages:=p_totalRecords/p_pageSize; ELSE p_totalPages:=p_totalRecords/p_pageSize+1; END IF; --验证页号 IF p_curPage<1 THEN p_curPage:=1; END IF; --如果取的当前页大于总页数则取最大页数的数据 IF p_curPage>p_totalPages THEN p_curPage:=p_totalPages; END IF; --实现分页查询 v_startRecord :=(p_curPage - 1) * p_pageSize + 1; v_endRecord :=p_curPage * p_pageSize; v_sql :='select '|| p_tableColum ||' from ( select rownum r_,c.* from '|| p_tableName ||' c where rownum <=' || v_endRecord ||' and '|| trim(p_strwhere) ||') u where u.r_ between '|| v_startRecord ||' and '|| v_endRecord; --DBMS_OUTPUT.put_line(v_sql); p_totalPages:=ceil(p_totalPages); --去整数总页 OPEN myrctypes FOR v_sql; return myrctypes; else dbms_output.put_line('输入的参数不合法条件,请核实后在执行该存储过程!'); end if; else dbms_output.put_line('输入的用户表名称在数据库里不存在!'); end if; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN BEGIN --日志都必须写到专门记录日志表 dbms_output.put_line(SQLCODE || ',' || SUBSTR(SQLERRM,1,80)); END; end; end prc_querys; END pkg_test; |