`
angkorpeach
  • 浏览: 122908 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

oracle存储过程分页

阅读更多

本文中的代码是我的同事陈为的作品:

 

设计原理是将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数据库中,实现分页查询通常有两种方法:一种是使用`ROWNUM`伪列,另一种则是通过存储过程实现。其中,使用存储过程进行...

    ibatis调用oracle存储过程分页

    ibatis调用oracle存储过程分页

    Oracle 存储过程分页

    Oracle 提供了多种方法实现分页查询,下面我们将详细探讨Oracle存储过程中的分页实现。 1. **ROWNUM伪列** 在早期的Oracle版本中,ROWNUM伪列被广泛用于分页。ROWNUM是在结果集生成时自动分配的,表示每一行的顺序...

    ORACLE存储过程分页

    ### ORACLE存储过程分页实现详解 在Oracle数据库中,实现数据分页是常见的需求,尤其是在处理大量数据时,为了提高查询效率和响应速度,分页技术显得尤为重要。本文将详细解析如何通过Oracle存储过程来实现分页功能...

    oracle 存储过程分页

    ### Oracle存储过程实现分页查询知识点详解 #### 一、背景与目的 在数据库操作中,分页查询是非常常见的需求之一。特别是在数据量较大的场景下,分页不仅可以提高查询效率,还能改善用户体验。Oracle数据库提供了...

    java Oracle存储过程分页整理

    本教程将深入探讨如何在Java中调用Oracle存储过程来执行分页查询。 首先,我们需要理解分页的基本概念。分页是将大结果集分割成多个小部分,每次只加载一部分数据到内存中,这样可以减少内存消耗,提高响应速度。在...

    基于ORACLE存储过程分页的实现方法.pdf

    《基于ORACLE存储过程分页的实现方法》 在当今信息化社会,关系型数据库Oracle作为主流的数据库管理系统,被广泛应用于各类信息系统中。随着大数据时代的到来,如何高效地处理和展示海量数据成为了一个重要的问题。...

    oracle存储过程分页.docx

    Oracle存储过程是数据库管理系统中用于执行特定数据库操作的预编译SQL和PL/SQL代码集合。在Oracle中,存储过程可以被用来实现复杂的业务逻辑,提高数据库性能,并且减少网络流量。分页查询是数据库应用中常见的功能...

    java—oracle存储过程分页

    一个简单的oracle存储过程分页技术,希望对大家的学习,开发有所帮助。 执行步骤: 1:在oralce客户端执行OracleSplit类中的包,和存储过程。 2:采用的是oracle只带的表emp大家下载后只需要把数据库名改为本地的...

    oracle 存储过程分页示例

    总的来说,Oracle存储过程结合ROWNUM伪列提供了灵活且高效的分页解决方案。通过这种方式,开发者可以方便地在应用程序中实现分页查询,同时保持良好的性能。在实际开发中,你可能需要根据具体的业务需求对这个示例...

    oracle分页查询并返回总记录数据存储过程

    ### Oracle 分页查询并返回总记录数据存储过程 在数据库应用开发中,为了提高用户体验以及减少服务器负担,分页查询成为了一种常见的技术手段。Oracle 数据库提供了多种方法来实现分页查询,其中使用存储过程是一种...

    Oracle分页+.cs代码+存储过程+Aspnetpager分页控件

    接下来,我们关注`.cs`代码部分,这部分通常涉及到C#后端如何调用Oracle存储过程并处理返回的数据。你可以使用Oracle Managed Data Access (ODP.NET)库来实现。以下是一个简单的示例: ```csharp using Oracle....

    Oracle的分页查询语句 Oracle分页的存储过程

    本文将详细探讨Oracle的分页查询语句及其存储过程。 首先,Oracle的分页查询语句通常遵循一个标准格式,如下所示: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( SELECT * FROM TABLE_NAME ) A WHERE ...

    asp.net使用oracle分页存储过程查询数据

    1、请先在Oracle数据中新建存储过程 2、修改代码中的相关参数。比如,连接数据库字符串,查询的sql语句等 注意:查询sql语句中必须包含rownum字段,别名是rn。rownum是Oracle关键字。 存储是来自...

    oracle 增加,删除,修改和分页存储过程

    在这个“Oracle增加、删除、修改和分页存储过程”项目中,我们将深入探讨这四个核心的数据库管理功能,并了解如何在PL/SQL环境中实现它们。 1. **增加(Insertion)**: 在Oracle中,创建一个用于插入数据的存储...

    通用ORACLE存储过程实现分页和查询

    总结来说,Oracle存储过程实现分页查询的关键在于动态构造SQL语句,结合ROWNUM或ROW_NUMBER()来实现分页。理解这一机制有助于我们在处理大量数据时编写高效、可复用的代码。在实际应用中,根据具体需求和数据库设计...

    oracle分页存储过程

    oracle分页存储过程,oracle分页存储过程

    oracle存储过程通用分页

    这篇博客“Oracle存储过程通用分页”将深入探讨如何利用Oracle存储过程来实现高效、灵活的分页功能。 首先,理解分页的基本概念至关重要。分页是将大型数据集分成若干小块,每次只加载一部分数据到内存中,这样可以...

    Oracle分页存储过程

    通过上述分析和示例,我们可以看到,利用Oracle存储过程进行分页查询不仅可以提高查询效率,还能增强代码的可读性和可维护性。在实际项目中,结合C#等高级语言的应用,可以进一步提升系统的性能和用户体验。

Global site tag (gtag.js) - Google Analytics