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 where ust.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;
|