一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - Oracle 存儲過程教程

Oracle 存儲過程教程

2019-11-08 15:37Oracle教程網 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分頁存儲過程的步驟。 
在.net調用返回記錄集的存儲過程,需要用到datareader,但是datareader不支持在datagrid中的分頁,因此需要利用datagrid自定義分頁功能。 

復制代碼代碼如下:


rotected 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 = 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 '"select rownum rn,t.* from cd_ssxl t" 
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) 
End Sub 
---------------------------------------------------------------------------------------- 
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
If Not Page.IsPostBack Then 
Dim psql As String = "select rownum rn,t.* from cd_ssxl t" 
gridbind(0, psql, 20) 
End If 
End Sub 
--------------------------------------------------------------------------------------- 
Private Sub DataGrid1_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid1.PageIndexChanged 
Dim psql As String = "select rownum rn,t.* from cd_ssxl t" 
Me.DataGrid1.CurrentPageIndex = e.NewPageIndex 
gridbind(e.NewPageIndex, psql, 20) 
End Sub 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91亚洲精品久久91综合 | 天天综合网网欲色 | 红色一片在线影视 | 国产在线看片护士免费视频 | 欧美最猛性xxxxx69交 | 国产高清视频在线 | 亚洲福利在线观看 | 日日摸日日添日日透 | 五月色天在线视频综合观看 | 日韩 国产 欧美 精品 在线 | 亚洲精品老司机福利在线播放 | 久久青草免费91线频观看站街 | 国产成人在线综合 | 糖心vlog麻豆精东影业传媒 | 国产免费成人在线视频 | 91九色视频无限观看免费 | 日韩欧美成末人一区二区三区 | 亚洲一区二区日韩欧美gif | 天天久久影视色香综合网 | 波多野结在线观看 | 九九艹| 日本a在线天堂 | 日韩在线资源 | 丝袜捆绑调教视频免费区 | 欧美一区二区不卡视频 | 亚洲精美视频 | bl超h 高h 污肉快穿np | 成人一区二区免费中文字幕 | 91国内精品线免费播放 | 波多野结衣在线免费观看 | 国产美女在线一区二区三区 | 四虎永久在线精品波多野结衣 | 国产精品成人亚洲 | 星空无限传媒xk8129 | a毛片免费全部在线播放毛 a级在线看 | youwu在线影院| 精品国产91久久久久久久a | 欧美国产日产精品免费视频 | 亚洲AV久久无码精品蜜桃 | 国产ay| 日本中文字幕在线观看视频 |