oracle存储过程分页

存储过程 create or replace package pkg_query
as type
cur_query is ref cursor;
procedure proc_qurey
(
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); --返回的结果集
end pkg_query;


create or replace package body pkg_query
is
create or replace
procedure proc_qurey
(
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 || ' and '|| p_strWhere;
end if;
execute immediate v_sql into p_totalRecords;

--验证页面记录大小
if p_pageSize<0 then
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<1 then
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 and ' || 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_endRecord || ') b where r >= ' || v_startRecord;

DBMS_OUTPUT.put_line(v_sql);

open v_cur for v_sql;
end proc_qurey;
end pkg_query;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值