在看了众多的分页存储过程以后发现都是针对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
[C语言系列]一个简单的jsp连接sqlserver数据库的小实例 [网页制作]一个简单的 js 上滚信息栏 [Web开发]一个简单的javascript菜单 [Web开发]一个简单的XMLSchema的例子 [Web开发]一个简单的XML服务器 [Web开发]一个简单的ASP.NET Forms 身份认证 [Web开发]一个简单的ASP分页程序 [MySql]php初探: 一个简单的mysql数据库分页的程序模板
|