一个简单的oracle分页存储过程的实现和调用[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 goodhy 的 blog

在看了众多的分页存储过程以后发现都是针对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;                  --返回记录总数                                                     
  

本文关键:一个简单的oracle分页存储过程的实现和调用
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top