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; /
oracle 动态分页,oracle动态分页函数
最新推荐文章于 2023-12-17 13:06:18 发布