Oracle分页存储过程

本文介绍了一种在Oracle数据库中实现分页查询的方法,通过创建一个存储过程包来简化复杂的分页逻辑。该包提供了参数化的查询接口,支持自定义表名、查询条件、排序字段及方式等功能。
第一步要先建立包
create or replace package pkg_query is
type cur_query is ref cursor;
procedure met_down_query(
   m_tablename in varchar2,--表名
   m_strwhere in varchar2,--查询条件
   m_ordercolumn in varchar2,--排序字段
   m_orderstyle in varchar2,--排序方式
   m_currpage in out number,--当前页
   m_pagesize in out number,--每页显示的记录数
   m_totalrow out number,--总记录数
   m_totalpage out number,--总页数
   v_cur out cur_query --返回结果集
);
end pkg_query;

第二步写存储过程语句
create or replace procedure met_down_query(
       m_tablename in varchar2,--表名
       m_strwhere in varchar2,--查询条件
       m_ordercolumn in varchar2,--排序字段
       m_orderstyle in varchar2,--排序方式
       m_currpage in out number,--当前页
       m_pagesize in out number,--每页显示的记录数
       m_totalrow out number,--总记录数
       m_totalpage out number,--总页数
       v_cur out pkg_query.cur_query --返回结果集
)
is
 v_sql varchar2(1000):=''; --sql语句
 v_startrecord number(4);--开始记录数
 v_endrecord number(4);--结束记录数
begin
  --总记录数
  v_sql:='select to_number(count(*)) from '||m_tablename||' where 1=1';
  if m_strwhere is not null or m_strwhere <>'' then
    v_sql:=v_sql || m_strwhere;
  end if;
  execute immediate v_sql into m_totalrow;
  --验证页面大小
  if m_pagesize<0 then
    m_pagesize:=0;
  end if;
  --根据页面大小计算总页数
  if mod(m_totalrow,m_pagesize)=0 then
    m_totalpage:=m_totalrow/m_pagesize;
  else
    m_totalpage:=m_totalrow/m_pagesize+1;
  end if;
  --验证页号
  if m_currpage<1 then
    m_currpage:=1;
  end if;
  
  if m_currpage>m_totalpage then
    m_currpage:=m_totalpage;
  end if;
  --实现分页查询
  v_startrecord:=(m_currpage-1)*m_pagesize+1;
  v_endrecord:=m_currpage*m_pagesize;
  v_sql:='select * from (select a.*,rownum r from '||
         '(select * from '||m_tablename;
     if m_strwhere is not null or m_strwhere <> '' then
       v_sql:=v_sql || 'where 1=1 '||m_strwhere;
     end if;
     if m_ordercolumn is not null or m_ordercolumn <> '' then
       v_sql:=v_sql || 'order by '||m_ordercolumn||''||m_orderstyle;
     end if;
     v_sql:=v_sql||')a where rownum<='||v_endrecord||')b where r>='
                       ||v_startrecord;
 dbms_output.put_line(v_sql);
 open v_cur for v_sql;
 end met_down_query;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值