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

如何在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);
其它类似信息

推荐信息