create or replace procedure sp_exec_dynamic_page(
/*
功能:实现动态分页
*/
var_tablename in VARCHAR2, -- 表名 employees e,departments d
var_tablecolumn in VARCHAR2, -- 查询列 a.employee_id,b.department_name
var_where in VARCHAR2, -- 查询条件 b.department_name like 'S%'
var_ordercolumn in VARCHAR2, -- 排序 b.department_name desc
var_pagesize in NUMBER, -- 每页大小 10
var_curpage in NUMBER, -- 当前页 1
var_rowcount OUT NUMBER, -- 返回总条数
--var_pagecount OUT NUMBER, -- 返回总页数
var_cursor OUT sys_refcursor -- 返回分页结果集
) is
v_tablecolumn varchar2(10);
v_where varchar2(200);
v_ordercolumn varchar2(200);
v_sql varchar2(2000);
v_count varchar2(2000);
v_pagesize integer;
v_total_page integer;
--v_total_count number(10);
v_curpage integer;
v_start_record integer;
v_end_record integer;
v_count_sql varchar2(2000);
begin
--必须输入表名,否则会报错
if trim(var_tablename) is null then
raise_application_error(-20001,'必须输入表明才能进行分页!');
end if;
--输入列名,列名必须以‘,’隔开,如果不输入则默认为全部列
if trim(var_tablecolumn) is not null then
v_tablecolumn:=var_tablecolumn;
else
v_tablecolumn:='*';
end if;
--判断是否存在where条件
if trim(var_where) is not null then
v_where:=' where 1=1 and '||var_where;
else
v_where:=' where 1=1';
end if;
--判断是否有order 不要条件
if trim(var_ordercolumn) is not null then
v_ordercolumn:=var_ordercolumn;
else
v_ordercolumn:='';
end if;
--查询总共的记录条数
v_count:='SELECT COUNT(*) FROM '||var_tablename ||v_where;
execute immediate v_count into var_rowcount;
--判断是否输入了每页显示的条数
if var_pagesize is not null then
v_pagesize:=var_pagesize;
else
v_pagesize:=10;
end if;
--得到总的页数
if mod(var_rowcount,v_pagesize)=0 then
v_total_page:=var_rowcount/v_pagesize;
else
v_total_page:=floor(var_rowcount/v_pagesize)+1;
end if;
--如果输入的当前页大于总的页,则取最后一页
if var_curpage>v_total_page then
v_curpage:=v_total_page;
else
v_curpage:=var_curpage;
end if;
--开始的记录条数
v_start_record:=(v_curpage-1)*v_pagesize+1; --结束的记录条数
v_end_record:=v_curpage*v_pagesize;
--拼接分页的sql语句
v_count_sql:='(select '|| v_tablecolumn ||' from '|| var_tablename || v_where || v_ordercolumn||') e';
v_sql:='select * from ('||'select rownum rn, e.* from '|| v_count_sql
||' where rownum<='|| v_end_record ||') p where p.rn>='||v_start_record;
--将查询的结果放入游标中
open var_cursor for v_sql;
end sp_exec_dynamic_page;
/
/*
功能:实现动态分页
*/
var_tablename in VARCHAR2, -- 表名 employees e,departments d
var_tablecolumn in VARCHAR2, -- 查询列 a.employee_id,b.department_name
var_where in VARCHAR2, -- 查询条件 b.department_name like 'S%'
var_ordercolumn in VARCHAR2, -- 排序 b.department_name desc
var_pagesize in NUMBER, -- 每页大小 10
var_curpage in NUMBER, -- 当前页 1
var_rowcount OUT NUMBER, -- 返回总条数
--var_pagecount OUT NUMBER, -- 返回总页数
var_cursor OUT sys_refcursor -- 返回分页结果集
) is
v_tablecolumn varchar2(10);
v_where varchar2(200);
v_ordercolumn varchar2(200);
v_sql varchar2(2000);
v_count varchar2(2000);
v_pagesize integer;
v_total_page integer;
--v_total_count number(10);
v_curpage integer;
v_start_record integer;
v_end_record integer;
v_count_sql varchar2(2000);
begin
--必须输入表名,否则会报错
if trim(var_tablename) is null then
raise_application_error(-20001,'必须输入表明才能进行分页!');
end if;
--输入列名,列名必须以‘,’隔开,如果不输入则默认为全部列
if trim(var_tablecolumn) is not null then
v_tablecolumn:=var_tablecolumn;
else
v_tablecolumn:='*';
end if;
--判断是否存在where条件
if trim(var_where) is not null then
v_where:=' where 1=1 and '||var_where;
else
v_where:=' where 1=1';
end if;
--判断是否有order 不要条件
if trim(var_ordercolumn) is not null then
v_ordercolumn:=var_ordercolumn;
else
v_ordercolumn:='';
end if;
--查询总共的记录条数
v_count:='SELECT COUNT(*) FROM '||var_tablename ||v_where;
execute immediate v_count into var_rowcount;
--判断是否输入了每页显示的条数
if var_pagesize is not null then
v_pagesize:=var_pagesize;
else
v_pagesize:=10;
end if;
--得到总的页数
if mod(var_rowcount,v_pagesize)=0 then
v_total_page:=var_rowcount/v_pagesize;
else
v_total_page:=floor(var_rowcount/v_pagesize)+1;
end if;
--如果输入的当前页大于总的页,则取最后一页
if var_curpage>v_total_page then
v_curpage:=v_total_page;
else
v_curpage:=var_curpage;
end if;
--开始的记录条数
v_start_record:=(v_curpage-1)*v_pagesize+1; --结束的记录条数
v_end_record:=v_curpage*v_pagesize;
--拼接分页的sql语句
v_count_sql:='(select '|| v_tablecolumn ||' from '|| var_tablename || v_where || v_ordercolumn||') e';
v_sql:='select * from ('||'select rownum rn, e.* from '|| v_count_sql
||' where rownum<='|| v_end_record ||') p where p.rn>='||v_start_record;
--将查询的结果放入游标中
open var_cursor for v_sql;
end sp_exec_dynamic_page;
/