第一步要先建立包
第二步写存储过程语句
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;

本文介绍了一种在Oracle数据库中实现分页查询的方法,通过创建一个存储过程包来简化复杂的分页逻辑。该包提供了参数化的查询接口,支持自定义表名、查询条件、排序字段及方式等功能。

被折叠的 条评论
为什么被折叠?



