一個簡單的oracle分頁預存程序的實現和調用

來源:互聯網
上載者:User
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



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。