oracle动态分页函数

本文介绍了一个用于Oracle数据库的动态分页存储过程。该过程通过输入表名、查询列、查询条件等参数,实现灵活的数据分页查询,并返回指定页数的数据集及总记录数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值