您好,欢迎访问一九零五行业门户网

在Oracle存储过程中实现分页

在oracle存储过程中实现分页,之所以用存储过程,是因为以后需要修改的话不需要修改程序代码,只需要修改存储过程的代码。但这个
几乎每一个web应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。
几乎每一个web应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。
之所以用存储过程,是因为以后需要修改的话不需要修改程序代码,,只需要修改存储过程的代码。但这个例子是在存储过程里动态生成的sql语句,不知道会不会因此失去存储过程一次编译和快速的特点。代码如下:
1、首先建立一个包,用户创建一个游标类型
create or replace package pkg_query as
  type cur_query is ref cursor;
end pkg_query;
2、创建存储过程
create or replace procedure prc_query
       (p_tablename        in  varchar2,   --表名
        p_strwhere         in  varchar2,   --查询条件
        p_ordercolumn      in  varchar2,   --排序的列
        p_orderstyle       in  varchar2,   --排序方式
        p_curpage          in out number,  --当前页
        p_pagesize         in out number,  --每页显示记录条数
        p_totalrecords     out number,     --总记录数
        p_totalpages       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 ' || p_tablename || ' where 1=1';
   if p_strwhere is not null or p_strwhere '' then
       v_sql := v_sql || p_strwhere;
   end if;
   execute immediate v_sql into p_totalrecords;
--验证页面记录大小
   if p_pagesize        p_pagesize := 0;
   end if;
--根据页大小计算总页数
   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        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 * from (select a.*, rownum r from ' ||
            '(select * from ' || p_tablename;
   if p_strwhere is not null or p_strwhere '' then
       v_sql := v_sql || ' where 1=1' || p_strwhere;
   end if;
   if p_ordercolumn is not null or p_ordercolumn '' then
       v_sql := v_sql || ' order by ' || p_ordercolumn || ' ' || p_orderstyle;
   end if;
   v_sql := v_sql || ') a where rownum = '
            || v_startrecord;
   dbms_output.put_line(v_sql);
   open v_cur for v_sql;
end prc_query;
3、java代码里取出结果集
string sql= { call prc_query(?,?,?,?,?,?,?,?,?) };
callablestatement call = con.preparecall(sql);
// ……中间数据设置及注册省略
call.registeroutparameter(9, oracletypes.cursor);
// 取出结果集
(resultset) call.getobject(9);
其它类似信息

推荐信息