本文中的代码是我的同事陈为的作品:
设计原理是将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数据库中,实现分页查询通常有两种方法:一种是使用`ROWNUM`伪列,另一种则是通过存储过程实现。其中,使用存储过程进行...
ibatis调用oracle存储过程分页
Oracle 提供了多种方法实现分页查询,下面我们将详细探讨Oracle存储过程中的分页实现。 1. **ROWNUM伪列** 在早期的Oracle版本中,ROWNUM伪列被广泛用于分页。ROWNUM是在结果集生成时自动分配的,表示每一行的顺序...
### ORACLE存储过程分页实现详解 在Oracle数据库中,实现数据分页是常见的需求,尤其是在处理大量数据时,为了提高查询效率和响应速度,分页技术显得尤为重要。本文将详细解析如何通过Oracle存储过程来实现分页功能...
### Oracle存储过程实现分页查询知识点详解 #### 一、背景与目的 在数据库操作中,分页查询是非常常见的需求之一。特别是在数据量较大的场景下,分页不仅可以提高查询效率,还能改善用户体验。Oracle数据库提供了...
本教程将深入探讨如何在Java中调用Oracle存储过程来执行分页查询。 首先,我们需要理解分页的基本概念。分页是将大结果集分割成多个小部分,每次只加载一部分数据到内存中,这样可以减少内存消耗,提高响应速度。在...
《基于ORACLE存储过程分页的实现方法》 在当今信息化社会,关系型数据库Oracle作为主流的数据库管理系统,被广泛应用于各类信息系统中。随着大数据时代的到来,如何高效地处理和展示海量数据成为了一个重要的问题。...
Oracle存储过程是数据库管理系统中用于执行特定数据库操作的预编译SQL和PL/SQL代码集合。在Oracle中,存储过程可以被用来实现复杂的业务逻辑,提高数据库性能,并且减少网络流量。分页查询是数据库应用中常见的功能...
一个简单的oracle存储过程分页技术,希望对大家的学习,开发有所帮助。 执行步骤: 1:在oralce客户端执行OracleSplit类中的包,和存储过程。 2:采用的是oracle只带的表emp大家下载后只需要把数据库名改为本地的...
总的来说,Oracle存储过程结合ROWNUM伪列提供了灵活且高效的分页解决方案。通过这种方式,开发者可以方便地在应用程序中实现分页查询,同时保持良好的性能。在实际开发中,你可能需要根据具体的业务需求对这个示例...
### Oracle 分页查询并返回总记录数据存储过程 在数据库应用开发中,为了提高用户体验以及减少服务器负担,分页查询成为了一种常见的技术手段。Oracle 数据库提供了多种方法来实现分页查询,其中使用存储过程是一种...
接下来,我们关注`.cs`代码部分,这部分通常涉及到C#后端如何调用Oracle存储过程并处理返回的数据。你可以使用Oracle Managed Data Access (ODP.NET)库来实现。以下是一个简单的示例: ```csharp using Oracle....
本文将详细探讨Oracle的分页查询语句及其存储过程。 首先,Oracle的分页查询语句通常遵循一个标准格式,如下所示: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( SELECT * FROM TABLE_NAME ) A WHERE ...
1、请先在Oracle数据中新建存储过程 2、修改代码中的相关参数。比如,连接数据库字符串,查询的sql语句等 注意:查询sql语句中必须包含rownum字段,别名是rn。rownum是Oracle关键字。 存储是来自...
在这个“Oracle增加、删除、修改和分页存储过程”项目中,我们将深入探讨这四个核心的数据库管理功能,并了解如何在PL/SQL环境中实现它们。 1. **增加(Insertion)**: 在Oracle中,创建一个用于插入数据的存储...
总结来说,Oracle存储过程实现分页查询的关键在于动态构造SQL语句,结合ROWNUM或ROW_NUMBER()来实现分页。理解这一机制有助于我们在处理大量数据时编写高效、可复用的代码。在实际应用中,根据具体需求和数据库设计...
oracle分页存储过程,oracle分页存储过程
这篇博客“Oracle存储过程通用分页”将深入探讨如何利用Oracle存储过程来实现高效、灵活的分页功能。 首先,理解分页的基本概念至关重要。分页是将大型数据集分成若干小块,每次只加载一部分数据到内存中,这样可以...
通过上述分析和示例,我们可以看到,利用Oracle存储过程进行分页查询不仅可以提高查询效率,还能增强代码的可读性和可维护性。在实际项目中,结合C#等高级语言的应用,可以进一步提升系统的性能和用户体验。