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

oracle|存储过程|分页|oracle|存储过程|分页

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

Dim conn As New OracleClient.OracleConnection()
Dim cmd As New OracleClient.OracleCommand()
Dim dr As OracleClient.OracleDataReader

Private Sub gridbind(ByVal pindex As Integer, ByVal psql As String, Optional ByVal psize As Integer = 10)

conn.ConnectionString = "Password=gzdlgis;User ID=gzdlgis;Data Source=gzgis"
cmd.Connection = conn
cmd.CommandType = CommandType.StoredProcedure
conn.Open()

'------------------------------------------------------------------------------------
cmd.CommandText = "DotNot.DotNetPageRecordsCount"
'------------------------------------------------------------------------------------
cmd.Parameters.Add("psqlcount", OracleType.VarChar).Value = psql
cmd.Parameters.Add("prcount", OracleType.Number).Direction = ParameterDirectio

时间: 2024-11-01 21:27:02

一个简单的oracle分页存储过程的实现和调用的相关文章

创建 Oracle 分页存储过程

,可以在执行时将其设置为指向不同的结果集.使用 REF CURSOR 输出参数可以将 Oracle 结构化程序的结果集传递回调用应用程序.通过在调用应用程序中定义 OracleType.Cursor 数据类型的输出参数,可以访问 REF CURSOR 所指向的结果集. create or replace package MF_PAK_001 is type t_cursor is ref cursor; procedure GetDataByPage( p_tableName varchar2,

利用JQuery写一个简单的异步分页插件_jquery

写了一个Jquery异步分页插件,拿出来分享一下,有不完善之处请指教. 以用户分页为例,先看一下效果,首先是第一页: 下一页或者点击第二页后: 点击尾页后: 效果还可以吧?来看看具体怎么用,首先后台要有一个Page模型: Page.java: public class Page { /** * 当前页号 */ private int currPageNum = 1; /** * 总记录数 */ private int totalRowSize = 0; /** * 每页记录数 */ privat

如何创建高效的Oracle分页存储过程

create or replace package p_page is -- Author : PHARAOHS -- Created : 2006-4-30 14:14:14 -- Purpose : 分页过程 TYPE type_cur IS REF CURSOR;   --定义游标变量用于返回记录集 PROCEDURE Pagination( Pindex in number,        --分页索引 Psql in varchar2,        --产生dataset的sql语句

java调用oracle分页存储过程示例_java

1.分页类 复制代码 代码如下: package org.zh.basic; /** * 页面类 *  * @author keven *  */public class PageInfo {     // 定义    private String p_tableName; // -表名    private String p_strWhere; // --查询条件    private String p_orderColumn; // --排序的列    private String p_or

一个简单的oracle触发器

    业务需要,写一个触发器    在tab_user_detail表增加一条数据后,往tab_user表增加一条记录    create trigger tri_user_insert    after insert on tab_user_detail    for each row    begin    insert into tab_user (USER_ID,USER_NAME,USER_PWD,USER_CUSTOMERNAME,USER_PHOTOS) values (:new

oracle分页存储过程 oracle存储过程实例_oracle

复制代码 代码如下: import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class TestPage {  public TestPage() { } public static void m

带排序的oracle分页存储过程

输入order by 的sqeuence是,应该为" desc"或者" asc" 若输入两个order by则,v_order_field=" a[sequence] ,order by b " CREATE OR REPLACE PROCEDURE TABLEPAGE_SELECT(v_page_size int, --the size of a page of list v_current_page int, --the current pa

.NET分页存储过程代码及使用

最近需要做个论坛,其中用到了分页,如果把整表的数据都查询出来未免小题大做,而且还影响速度 ,所以百度了并私有化了一个分页存储过程,实现了调用. 好了,废话不多说,贴出代码: /**** 使用帮助 首先查询表总行数,再查询分页数据 查询行数传入参数:@doCount,@tblName 查询分页传入参数:@tblName,@PageSize,@PageIndex,@fldName *以上不带查询条件的查询 带条件的加参数:@strWhere *分页查询可以使用排序 参数:@OrderType ***

经过优化测试的SQL分页存储过程

  建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存.游标一建立,就将相关的记录锁住,直到取消游标.游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的