首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > 一个关于Oracle分页的实现方案
【标  题】:一个关于Oracle分页的实现方案
【关键字】:Oracle
【来  源】:http://blog.csdn.net/peacefulsword/archive/2006/07/30/1000827.aspx

一个关于Oracle分页的实现方案

前言:

在使用数据库进行项目的开发过程中,往往需要对查询结果进行分页处理,但由于每个数据库管理系统的实现不同,所使用的方法也不相同,本文展示了一个在使用Oracle数据库管理系统时的一个分页方案。

注意:

在此展现的是一种方法,并不是一个通用的分页存储过程。

环境:

OSMicrosoft® Windows Server 20003

DBMSOracle9i Enterprise Edition Release 9.2.0.3.0

数据表:

方案中假设数据库中存在如下的示例数据库:

Create table authors(

Au_id 
varchar211 ) primary key ,

Au_lname 
varchar240 ) not null ,

Au_fname 
varchar220 ) not null ,

Phone 
varchar212 ) not null ,

Address 
varchar24 ) null ,

City 
varchar220 ) null ,

Zip 
char6 ) null

)

 存储过程:
CREATE OR REPLACE  PACKAGE DIVPAGE  as
/**//*******************************************************************
*
* 作者:Dorian Deng
* 创建日期:2006-05-05
* 说明:
*   用于记录总页数和当前页的最小和最大记录号
*
*******************************************************************
*/

procedure getPageRownum
(
  recordCount 
in number ,
  pageSize 
in number ,
  pageIndex 
in number ,
  pageCount out 
number ,
  pageMinRownum out 
number ,
  pageMaxRownum out 
number
);
end;
/
CREATE OR REPLACE  PACKAGE BODY DIVPAGE  as
/**//*******************************************************************
*
* 作者:Dorian Deng
* 创建日期:2006-05-05
* 说明:
*   用于记录总页数和当前页的最小和最大记录号
*
*******************************************************************
*/

procedure getPageRownum
(
  recordCount 
in number ,
  pageSize 
in number ,
  pageIndex 
in number ,
  pageCount out 
number ,
  pageMinRownum out 
number ,
  pageMaxRownum out 
number
)
as
begin
  pageCount :
= ceil( recordCount / pageSize ) ;
  pageMaxRownum :
= pageIndex * pageSize ;
  pageMinRownum :
= pageMaxRownum - pageSize + 1 ;
end getPageRownum;

end;

/

CREATE OR REPLACE  PACKAGE AUTHORSPACKAGE  as
/**//*******************************************************************
*
* 作者:Dorian Deng
* 创建日期:2006-05-05
* 说明:
*   用于记录总页数和当前页的最小和最大记录号
*
*******************************************************************
*/

type t_cursor 
is ref cursor  ;
procedure SelectAuthors
(
  zip_in 
in char ,
  pageIndex 
in number ,
  pageSize 
in number ,
  pageCount out 
number ,
  AuthorsList out t_cursor
);

end AUTHORSPACKAGE ;

/ 

CREATE OR REPLACE  PACKAGE BODY  AUTHORSPACKAGE  as
/**//*******************************************************************
*
* 作者:Dorian Deng
* 创建日期:2006-05-05
* 说明:
*   用于记录总页数和当前页的最小和最大记录号
*
*******************************************************************
*/

procedure SelectAuthors
(
zip_in 
in char ,           --查询的条件
  pageIndex in number ,           --页码,以1开始
  pageSize in number ,           --每页记录数
  pageCount out number ,           --总页数
  AuthorsList out t_cursor           --当前页记录值
)
as
recordCount 
number ;
pageMinRownum 
number ;
pageMaxRownum 
number ;
begin
  
select count* ) into recordCount from ( select Au_id from authors ) ;
  DIVPAGE.getPageRownum( recordCount , pageSize , pageIndex ,
      pageCount , pageMinRownum , pageMaxRownum ) ;
  
open AuthorsList for
    
select * from ( --本级查询得出排序的结果集的rownum
select rownum rn , Au_id  ,
          Au_lname  ,
          Au_fname ,
          Phone  ,
          Address  ,
          City  ,
          Zip
          
from (
--本级查询按给定条件得出结果集,如果使用了order by,其rownum可能乱序,
--
所以需要外一级的查询,同时直接使用zip_in参数,可防止SQL注入
select  Au_id  ,
Au_lname  ,  Au_fname ,  Phone  , Address  ,City  ,Zip
from authors where zip = zip_in order by au_lname ) )
          
where rn between pageMinRownum and pageMaxRownum ;
end ;
 

end AUTHORSPACKAGE ;


参考:

1.一种分页的通用存储过程

create or replace package DotNet is

  
-- Author  : good_hy

  
-- Created : 2004-12-13 13:30:30

  
-- Purpose :

  TYPE type_cur 
IS REF CURSOR;     --定义游标变量用于返回记录集   

  
PROCEDURE DotNetPagination(     

  Pindex 
in number,                --分页索引  

  Psql 
in varchar2,                --产生dataset的sql语句

  Psize 
in number,                 --页面大小

  Pcount out 
number,               --返回分页总数

  v_cur out type_cur               
--返回当前页数据记录

  );  

  
procedure DotNetPageRecordsCount(

  Psqlcount 
in varchar2,           --产生dataset的sql语句                           

  Prcount   out 
number             --返回记录总数

  );

end DotNot;


create or replace package body DotNet is

--****************************************************************

PROCEDURE DotNetPagination(

  Pindex 
in number,

  Psql 
in varchar2,

  Psize 
in number

  Pcount out 
number,

  v_cur out type_cur

)

AS

  v_sql 
VARCHAR2(1000);

  v_count 
number

  v_Plow 
number;

  v_Phei 
number;

Begin

  
------------------------------------------------------------取分页总数

  v_sql :
= 'select count(*) from (' || Psql || ')';

  
execute immediate v_sql into v_count;

  Pcount :
= ceil(v_count/Psize);

  
------------------------------------------------------------显示任意页内容

  v_Phei :
= Pindex * Psize + Psize;

  v_Plow :
= v_Phei - Psize + 1;

  
--Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必须包含rownum字段

  v_sql :
= 'select * from (' || Psql || ') where rn between ' || v_Plow || ' and ' || v_Phei ;

  
open v_cur for v_sql;

End DotNetPagination;

--********************************************************

procedure DotNetPageRecordsCount(

  Psqlcount 
in varchar2,

  Prcount   out 
number

  )

 
as

   v_sql 
varchar2(1000);

   v_prcount 
number;

 
begin

   v_sql :
= 'select count(*) from (' || Psqlcount || ')';

   
execute immediate v_sql into v_prcount;

   Prcount :
= v_prcount;                  --返回记录总数

    
end DotNetPageRecordsCount; 

--*************************************************************

end DotNot;

在查询分析器中进行的数据定义操作举例:【上一篇】
NETCF开发之用户界面设计:【下一篇】
【相关文章】
  • 在Ubuntu Dapper 6.06 LTS上安装Oracle Express Edition 1
  • Oracle 10G throught resetlogs recovery
  • 收藏 Rainny 的关于Oracle 10046事件的经典文章
  • ORACLE PLSQL使用经验总结_网上一位朋友所写
  • oracle中的ROWID与分页
  • Oracle LogMiner 配置
  • oracle学习常用命令
  • redhat企业版3中安装oracle10gR2 (1)
  • oracle数据库自动备份的实现历程
  • 在SQL Server 2000中添加Oracle链接服务器
  • 【随机文章】
  • Asp网络小偷
  • Something About ! CSS
  • LINUX下的ssh认证,不用密码登陆另一台机器
  • java产生随机数的两种途径
  • VC71的一个超奇怪问题
  • OICQ“隐性埋名”技巧指南
  • Linux的冲击和操作系统的革命
  • isalpha ( )【C语言库函数源代码】
  • 编程之道(转贴)
  • JRun常见问题回答
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.