打印本文 打印本文 关闭窗口 关闭窗口
一个简单的oracle分页存储过程的实现和调用
作者:武汉SEO闵涛  文章来源:敏韬网  点击数917  更新时间:2009/4/22 21:59:08  文章录入:mintao  责任编辑:mintao


  在看了众多的分页存储过程以后发现都是针对sqlserver的,而没有oracle的,因此想写一个关于oracle的存储过程,因为我用到的数据库是oracle.
---------------------------------------------------------------------------------------
oracle分页存储过程的思路于sqlserver的思路是一样的,但是我这里做了点改动,在因为oracle的语法和规则的不同所以,oracle分页
存储过程看上去有点不一样。见笑,见笑!

在oracle的存储过程中返回记录集,需要用到游标变量,oracle不能像sqlserver那样可以直接返回一个记录集。
由于设想在.net中把复杂的sql语句生成,所以在存储过程中没有去考虑生成sql语句的问题。
-----------------------------------------------------------------------------------
以下是在oracle中实现的分页存储过程。

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;

------------------------------------------------------------------------------------------
以下是在.net中调用oracle分页存储过程的步骤。(vb.net)
在.net调用返回记录集的存储过程,需要用到datareader,但是datareader不支持在datagrid中的分页,因此需要利用datagrid
自定义分页功能。


    Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid




打印本文 打印本文 关闭窗口 关闭窗口