Sybase分頁顯示存儲(chǔ)過程
實(shí)現(xiàn)Sybase分頁顯示存儲(chǔ)過程是我們經(jīng)常會(huì)遇到的問題,下面就對(duì)Sybase分頁顯示存儲(chǔ)過程的方法進(jìn)行詳細(xì)介紹,供您參考。
建立一個(gè)web應(yīng)用,分頁瀏覽功能必不可少。這個(gè)問題是數(shù)據(jù)庫處理中十分常見的問題。經(jīng)典的數(shù)據(jù)分頁方法是:ADO 紀(jì)錄集分頁法,也就是利用ADO自帶的分頁功能(利用游標(biāo))來實(shí)現(xiàn)分頁。但這種分頁方法僅適用于較小數(shù)據(jù)量的情形,因?yàn)橛螛?biāo)本身有缺點(diǎn):游標(biāo)是存放在內(nèi)存中,很費(fèi)內(nèi)存。游標(biāo)一建立,就將相關(guān)的記錄鎖住,直到取消游標(biāo)。游標(biāo)提供了對(duì)特定集合中逐行掃描的手段,一般使用游標(biāo)來逐行遍歷數(shù)據(jù),根據(jù)取出數(shù)據(jù)條件的不同進(jìn)行不同的操作。而對(duì)于多表和大表中定義的游標(biāo)(大的數(shù)據(jù)集合)循環(huán)很容易使程序進(jìn)入一個(gè)漫長的等待甚至死機(jī)。
更重要的是,對(duì)于非常大的數(shù)據(jù)模型而言,分頁檢索時(shí),如果按照傳統(tǒng)的每次都加載整個(gè)數(shù)據(jù)源的方法是非常浪費(fèi)資源的。現(xiàn)在流行的分頁方法一般是檢索頁面大小的塊區(qū)的數(shù)據(jù),而非檢索所有的數(shù)據(jù),然后單步執(zhí)行當(dāng)前行。
最早較好地實(shí)現(xiàn)這種根據(jù)頁面大小和頁碼來提取數(shù)據(jù)的方法大概就是“俄羅斯存儲(chǔ)過程”。這個(gè)存儲(chǔ)過程用了游標(biāo),由于游標(biāo)的局限性,所以這個(gè)方法并沒有得到大家的普遍認(rèn)可。
下面的存儲(chǔ)過程就是結(jié)合我們的辦公自動(dòng)化實(shí)例寫的Sybase分頁存儲(chǔ)過程:
- CREATE procedure pagination1
- (@pagesize int, --頁面大小,如每頁存儲(chǔ)20條記錄
- @pageindex int --當(dāng)前頁碼
- )
- as
- set nocount on
- begin
- declare @indextable table(id int identity(1,1),nid int) --定義表變量
- declare @PageLowerBound int --定義此頁的底碼
- declare @PageUpperBound int --定義此頁的頂碼
- set @PageLowerBound=(@pageindex-1)*@pagesize
- set @PageUpperBound=@PageLowerBound+@pagesize
- set rowcount @PageUpperBound
- insert into @indextable(nid) select gid from TGongwen where fariqi >dateadd(day,-365,getdate()) order by fariqi desc
- select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid
- and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
- end
- set nocount off
以上存儲(chǔ)過程運(yùn)用了SQL SERVER的最新技術(shù)――表變量。應(yīng)該說這個(gè)存儲(chǔ)過程也是一個(gè)非常優(yōu)秀的分頁存儲(chǔ)過程。當(dāng)然,在這個(gè)過程中,您也可以把其中的表變量寫成臨時(shí)表:CREATE TABLE #Temp。但很明顯,在SQL SERVER中,用臨時(shí)表是沒有用表變量快的。所以剛開始使用這個(gè)存儲(chǔ)過程時(shí),感覺非常的不錯(cuò),速度也比原來的ADO的好。
【編輯推薦】