本文中的代码是我的同事陈为的作品:
设计原理是将hibernate的分页方法提炼出来,写成存储过程,并将查询结果以游标的形式返回。
第一步:
CREATE OR REPLACE PACKAGE pack AS
TYPE cur IS REF CURSOR;
END pack;
存储过程:
create or replace procedure cutpage(
-----------------------------------------
--name: 公用方法
--description: 分页查询
--version: v1.0
--created date: 2008-10-07
--author:
--last updated:
--last updated by:
-----------------------------------------
Psql in varchar2, --产生数据集SQL语句 如需排序,请在语句内写好
Psize in number, --每页大小
CurrentPage in number, --当前页码
ProwCount in out number, --返回值:行数
PageCount out number, --返回分页总数
Rcursor out pack.cur
)
as
v_sql varchar2(4000); --中间sql变量
v_currentpage number; --当前页码
v_Plow number; --结果集的下限
v_Phei number; --结果集的上限
v_Psize number;
begin
v_sql :=Psql;
if(v_sql is null) then
return;
end if;
-------------------------------------------变量赋值
if CurrentPage is null then
v_currentpage := 1;
else
v_currentpage := CurrentPage;
end if;
if Psize is null then
v_Psize :=10;
else
v_Psize:=Psize;
end if;
-------------------------------------------取分页总数和总的记录数
if ProwCount is null then
v_sql := 'select count(*) from (' || Psql || ')';
execute immediate v_sql into ProwCount;
PageCount := ceil(ProwCount/v_Psize);
else
PageCount := ceil(ProwCount/v_Psize);
end if;
-------------------------------------------返回选择页码的数据集
if v_currentpage = 1 then
v_sql := 'select * from ('||Psql||')
where rownum <= '||v_Psize||'';
else
v_Phei := v_currentpage * v_Psize;
v_Plow := v_Phei - v_Psize + 1;
v_sql := 'select * from ( select row_.*, rownum rownum_
from ('||Psql||') row_
where rownum <= ' || v_Phei || ' ) where rownum_ > ' || v_Plow || '';
end if;
--dbms_output.put_line(v_sql);
-------------------------------------------绑定游标
open rCursor for v_sql;
Exception
when others then
--异常处理
rollback;
end cutpage;
增加了排序功能的存储过程:
create or replace procedure cutpage2(
-----------------------------------------
--name: 公用方法
--description: 分页查询
--version: v1.0
--created date: 2008-10-07
--author:
--last updated:
--last updated by:
-----------------------------------------
Psql in varchar2, --产生数据集SQL语句
Psize in number, --每页大小
CurrentPage in number, --当前页码
Pfield in varchar2, --排序字段
Porder in varchar2, --排序顺序
ProwCount in out number, --返回值:行数
PageCount out number, --返回分页总数
Rcursor out pack.cur
)
as
v_sql varchar2(4000); --中间sql变量
v_currentpage number; --当前页码
v_porder varchar2(50); --排序顺序
v_rowcount number; --行数
v_Plow number; --结果集的下限
v_Phei number; --结果集的上限
v_Psize number;
v_order varchar2(100):='';
begin
v_sql :=Psql;
if(v_sql is null) then
return;
end if;
-------------------------------------------变量赋值
if CurrentPage is null then
v_currentpage := 1;
else
v_currentpage := CurrentPage;
end if;
v_porder := Porder;
v_rowcount := ProwCount;
if Psize is null then
v_Psize :=15;
else
v_Psize:=Psize;
end if;
if v_porder is null then
v_porder := 'asc';
end if;
if Pfield is not null then
v_order := 'order by '||Pfield||' '||v_porder||'';
end if;
-------------------------------------------取分页总数和总的记录数
if v_rowcount is null then
v_sql := 'select count(*) from (' || Psql || ')';
execute immediate v_sql into ProwCount;
PageCount := ceil(ProwCount/v_Psize);
else
PageCount := ceil(v_rowcount/v_Psize);
end if;
-------------------------------------------返回选择页码的数据集
if v_currentpage = 1 then
v_sql := 'select * from ('||Psql||' '||v_order||')
where rownum <= '||v_Psize||'';
else
v_Phei := v_currentpage * v_Psize;
v_Plow := v_Phei - v_Psize + 1;
v_sql := 'select * from ( select row_.*, rownum rownum_
from ('||Psql||' '||v_order||') row_
where rownum <= ' || v_Phei || ' ) where rownum_ > ' || v_Plow || '';
end if;
--dbms_output.put_line(v_sql);
-------------------------------------------绑定游标
open rCursor for v_sql;
Exception
when others then
--异常处理
rollback;
end cutpage2;
分享到:
相关推荐
Oracle存储过程分页代码 Oracle存储过程分页代码 Oracle存储过程分页代码 Oracle存储过程分页代码 Oracle存储过程分页代码
ibatis调用oracle存储过程分页
Oracle 存储过程 Oracle分页 oracle分页
oracle 存储过程分页,个人学习笔记。
ORACLE存储过程分页
java 调用Oracle存储过程进行分页详解
oracle存储过程分页.docx 是打发发送到发送到发生的士大夫撒旦发生士大夫撒旦
基于ORACLE存储过程分页的实现方法.pdf
一个简单的oracle存储过程分页技术,希望对大家的学习,开发有所帮助。 执行步骤: 1:在oralce客户端执行OracleSplit类中的包,和存储过程。 2:采用的是oracle只带的表emp大家下载后只需要把数据库名改为本地的...
oracle分页查询并返回总记录数据的存储过程
Oracle的分页查询语句以及Oracle分页的存储过程
NULL 博文链接:https://jsufly.iteye.com/blog/646683
Oracle分页+.cs代码+存储过程+Aspnetpager分页控件 有详细的default.aspx页面调用实例代码
1、请先在Oracle数据中新建存储过程 2、修改代码中的相关参数。比如,连接数据库字符串,查询的sql语句等 注意:查询sql语句中必须包含rownum字段,别名是rn。rownum是Oracle关键字。 存储是来自...
项目开发中写的oracle 增加,删除,修改,分页存储过程,含有对条件的判断和错误处理
oracle分页存储过程,oracle分页存储过程
一个通用的存储过程,完成分页查询数据,只需要在查询的最后调用此过程,即可实现分页和按分页进行查询数据
高效多条件 Oracle 分页存储过程 ,快速分页
SQL Server 存储过程及Oracle SQL语句分页