Oracle存储过程教程
2023-06-13 09:14:13 时间
Oracle分页存储过程的思路于sqlserver的思路是一样的,但是我这里做了点改动,在因为Oracle的语法和规则的不同所以,Oracle分页存储过程看上去有点不一样。见笑,见笑!
在Oracle的存储过程中返回记录集,需要用到游标变量,Oracle不能像sqlserver那样可以直接返回一个记录集。
由于设想在.net中把复杂的sql语句生成,所以在存储过程中没有去考虑生成sql语句的问题。
以下是在Oracle中实现的分页存储过程。
复制代码代码如下:
在Oracle的存储过程中返回记录集,需要用到游标变量,Oracle不能像sqlserver那样可以直接返回一个记录集。
由于设想在.net中把复杂的sql语句生成,所以在存储过程中没有去考虑生成sql语句的问题。
以下是在Oracle中实现的分页存储过程。
createorreplacepackageDotNetis
--Author:good_hy
--Created:2004-12-1313:30:30
--Purpose:
TYPEtype_curISREFCURSOR;--定义游标变量用于返回记录集
PROCEDUREDotNetPagination(
Pindexinnumber,--分页索引
Psqlinvarchar2,--产生dataset的sql语句
Psizeinnumber,--页面大小
Pcountoutnumber,--返回分页总数
v_curouttype_cur--返回当前页数据记录
);
procedureDotNetPageRecordsCount(
Psqlcountinvarchar2,--产生dataset的sql语句
Prcountoutnumber--返回记录总数
);
endDotNot;
createorreplacepackagebodyDotNetis
--***************************************************************************************
PROCEDUREDotNetPagination(
Pindexinnumber,
Psqlinvarchar2,
Psizeinnumber,
Pcountoutnumber,
v_curouttype_cur
)
AS
v_sqlVARCHAR2(1000);
v_countnumber;
v_Plownumber;
v_Pheinumber;
Begin
------------------------------------------------------------取分页总数
v_sql:="selectcount(*)from("||Psql||")";
executeimmediatev_sqlintov_count;
Pcount:=ceil(v_count/Psize);
------------------------------------------------------------显示任意页内容
v_Phei:=Pindex*Psize+Psize;
v_Plow:=v_Phei-Psize+1;
--Psql:="selectrownumrn,t.*fromcd_ssxlt";--要求必须包含rownum字段
v_sql:="select*from("||Psql||")wherernbetween"||v_Plow||"and"||v_Phei;
openv_curforv_sql;
EndDotNetPagination;
--**************************************************************************************
procedureDotNetPageRecordsCount(
Psqlcountinvarchar2,
Prcountoutnumber
)
as
v_sqlvarchar2(1000);
v_prcountnumber;
begin
v_sql:="selectcount(*)from("||Psqlcount||")";
executeimmediatev_sqlintov_prcount;
Prcount:=v_prcount;--返回记录总数
endDotNetPageRecordsCount;
--**************************************************************************************
endDotNot;
以下是在.net中调用Oracle分页存储过程的步骤。
在.net调用返回记录集的存储过程,需要用到datareader,但是datareader不支持在datagrid中的分页,因此需要利用datagrid自定义分页功能。
rotectedWithEventsDataGrid1AsSystem.Web.UI.WebControls.DataGrid
DimconnAsNewOracleClient.OracleConnection()
DimcmdAsNewOracleClient.OracleCommand()
DimdrAsOracleClient.OracleDataReader
PrivateSubgridbind(ByValpindexAsInteger,ByValpsqlAsString,OptionalByValpsizeAsInteger=10)
conn.ConnectionString="Password=gzdlgis;UserID=gzdlgis;DataSource=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=ParameterDirection.Output
cmd.ExecuteNonQuery()
Me.DataGrid1.AllowPaging=True
Me.DataGrid1.AllowCustomPaging=True
Me.DataGrid1.PageSize=psize
Me.DataGrid1.VirtualItemCount=cmd.Parameters("prcount").Value
cmd.Parameters.Clear()
"------------------------------------------------------------------------------------
cmd.CommandText="DotNot.DotNetPagination"
"------------------------------------------------------------------------------------
cmd.Parameters.Add("pindex",Data.OracleClient.OracleType.Number).Value=pindex
cmd.Parameters.Add("psql",Data.OracleClient.OracleType.VarChar).Value=psql""selectrownumrn,t.*fromcd_ssxlt"
cmd.Parameters.Add("psize",Data.OracleClient.OracleType.Number).Value=psize
cmd.Parameters.Add("v_cur",Data.OracleClient.OracleType.Cursor).Direction=ParameterDirection.Output
cmd.Parameters.Add("pcount",Data.OracleClient.OracleType.Number).Direction=ParameterDirection.Output
dr=cmd.ExecuteReader()
Me.DataGrid1.DataSource=dr
Me.DataGrid1.DataBind()
dr.Close()
conn.Close()
Response.Write("总计页数"&cmd.Parameters("pcount").Value)
EndSub
----------------------------------------------------------------------------------------
PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
IfNotPage.IsPostBackThen
DimpsqlAsString="selectrownumrn,t.*fromcd_ssxlt"
gridbind(0,psql,20)
EndIf
EndSub
---------------------------------------------------------------------------------------
PrivateSubDataGrid1_PageIndexChanged(ByValsourceAsObject,ByValeAsSystem.Web.UI.WebControls.DataGridPageChangedEventArgs)HandlesDataGrid1.PageIndexChanged
DimpsqlAsString="selectrownumrn,t.*fromcd_ssxlt"
Me.DataGrid1.CurrentPageIndex=e.NewPageIndex
gridbind(e.NewPageIndex,psql,20)
EndSub
相关文章
- Oracle文件存储技术:安全可靠的解决方案(oracle文件存储)
- Oracle安装与配置指南(oracle安装配置教程)
- 使用Oracle存储过程导出数据(oracle存储过程导出)
- Oracle表空间:存储和管理数据的桶(什么是oracle表空间)
- 教程学习Oracle:存储过程视频教程(oracle存储过程视频)
- 获得 Oracle 认证:精通视频指南(oracle认证视频)
- Oracle 索引分区:优化存储结构(oracle索引分区)
- 查询Oracle表中行数快速实现(oracle表行数)
- Oracle教程:学习视频,即刻下载(oracle教程视频下载)
- Oracle 数据库分级查询的使用方法介绍(分级查询oracle)
- 百分比Oracle数据库表碎片百分比的检查(oracle查看表的碎片)
- Oracle顺序存储究竟有何好处?(oracle顺序存储)
- Oracle 勇夺收入冠军(oracle公司收入)
- Oracle 全库调用技术查询语句指南 (oracle全库查询语句)
- DB2与Oracle的比较谁最合适(db2_oracle)
- BDCP无压力,Oracle 安全可靠(bdcp oracle)
- Oracle数据库中处理空字段的技巧(oracle为空怎么标识)
- Oracle中表的分区提高存储与查询效率(oracle中表分区)
- 云上学习Oracle云计算培训体验(oracle云培训)
- Oracle 二进制流存储读取与操作(oracle 二进制流)
- Oracle的超长文本存储挑战与机遇(oracle保存超长文本)
- 表达式Oracle中正则表达式的神奇力量(oracle中有没有正则)
- Oracle中获取十天后的日期(oracle中日期加十天)
- 利用Oracle中的Cols实现数据库结构优化(oracle 中cols)
- Oracle 无需存储过程开启新潮流(oracle不用存储过程)
- Oracle LTO4存储解决方案强大可靠的长期归档之选(oracle lto4)
- 探究Oracle ASM原理谁装置了属于你的存储(oracle asm原理)
- Oracle 年龄之谜不可思议篇(oracle age)