zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Oracle存储过程教程

2023-06-13 09:14:13 时间
Oracle分页存储过程的思路于sqlserver的思路是一样的,但是我这里做了点改动,在因为Oracle的语法和规则的不同所以,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