<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    什么都沒有的路邊攤

    無證小販

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      7 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks

    分頁(Paging) / SQL Server / Oracle
    雖然 DataGrid 控件自己帶了一個分頁處理機制,但它是將符合查詢條件的所有記錄讀入內存,然后進行分頁顯示的。隨著符合條件的記錄數目增多,就會出現運行效率問題,或者至少是資源的利用率下降。

    下面的代碼示例都以下面的表結構為準:

        Articles 表     SQL Server 類型      Oracle 類型
    PK    Id              int (自增)            number(9) (插入時在當前最大值上加1)
         Author          nvarchar(10)         nvarchar2(10)
         Title           nvarchar(50)         nvarchar2(50)
         PubTime         datetime date


    SQL Server / Access 等微軟產品中,我們通常的自定義分頁有兩種思路:

    一種是以 ASP.NET Forum 為代表的、“臨時表”方法:即在存儲過程中建立一個臨時表,該臨時表包含一個序號字段(1,2,3,....)以及表的主鍵(其他能夠唯一確定一行記錄的字段也是可以的)字段。存儲過程可能如下:(編號 SS1)

    CREATE Procedure GetAllArticles_Paged
    (
         @PageIndex int,
         @PageSize int,
         @TotalRecords out int,
         @TotalPages out int
    )
    AS

    DECLARE @PageLowerBound int
    DECLARE @PageUpperBound int

    -- Set the page bounds
    SET @PageLowerBound = @PageSize * @PageIndex
    SET @PageUpperBound = @PageLowerBound + @PageSize + 1

    -- Create a temp table to store the select results
    CREATE TABLE #tmp
    (
         RecNo int IDENTITY (1, 1) NOT NULL,
         ArticleID int
    )

    INSERT INTO #tmp
         SELECT [ID]
         FROM Articles
         ORDER BY PubTime DESC

    SELECT A.*
    FROM Articles A (nolock), #tmp T
    WHERE A.ID = T.ArticleID AND
         T.RecNo > @PageLowerBound AND
         T.RecNo < @PageUpperBound
    ORDER BY T.RecNo

    GO
    另一種可能更適合程序中“拼湊” SQL 語句:用兩次 TOP 命令取得我們所要的分頁數據,例如:(編號 SS2)

    SELECT * FROM
         (
         SELECT TOP(PageSize) * FROM
         (
              SELECT TOP (PageSize * PageIndex) *
              FROM Articles
              ORDER BY PubTime DESC
         )
         ORDER BY PubTime ASC
    )
    ORDER BY PubTime DESC
    這個的想法就是“掐頭去尾”,還有不少分頁的方法,這里就不一一列出了。

    對于 Oracle 數據庫,有幾處不同嚴重妨礙了上面幾個方法的實施,比如,Oracle 不支持 TOP 關鍵字:不過這個好像并不十分嚴重,因為它提供了 rownum 這個隱式游標,可以實現與 TOP 類似的功能,如:

    SELECT TOP 10 ... FROM WHERE ...
    要寫成

    SELECT ... FROM ... WHERE ... AND rownum <= 10
    rownum 是記錄序號(1,2,3...),但有一個比較麻煩的事情是:如果 SQL 語句中有 ORDER BY ... 排序的時候,rownum 居然是先“標號”后排序!這樣,這個序號如果不加處理是不合乎使用需求的。

    至于臨時表,Oracle 的臨時表和 SQL Server 的有很大不同,我還沒搞懂這個東西,就不妄加揣測了。

    國內網站中介紹 Oracle 分頁的資料很少,我找到了一個國外站點(www.faqts.com)的一篇 FAQ,根據這篇文章的介紹,可以如下分頁:(編號 Ora1)

    SELECT * FROM
         (
         SELECT A.*, rownum r
         FROM
              (
              SELECT *
              FROM Articles
              ORDER BY PubTime DESC
              ) A
         WHERE rownum <= PageUpperBound
         ) B
    WHERE r > PageLowerBound;

    posted on 2007-04-16 23:46 shadeclipse 閱讀(219) 評論(0)  編輯  收藏 所屬分類: 技術堆累
    主站蜘蛛池模板: 成人免费区一区二区三区 | 国产高清免费在线| 亚洲偷自精品三十六区| 亚洲成av人片在线观看无码不卡| 91亚洲国产成人久久精品| 最近中文字幕电影大全免费版| 久久久亚洲欧洲日产国码二区 | 美国毛片亚洲社区在线观看| 四虎成人免费影院网址| 亚洲日韩AV一区二区三区中文| 成人一a毛片免费视频| 国产成人精品久久亚洲高清不卡 | 亚洲国产精品无码观看久久| 女人18毛片a级毛片免费视频| 亚洲精品9999久久久久无码 | 亚洲乱码精品久久久久..| 亚洲人成www在线播放| 日本高清免费观看| 亚洲精品99久久久久中文字幕 | 国产亚洲无线码一区二区| 在线成人精品国产区免费| 2022年亚洲午夜一区二区福利| 97视频热人人精品免费| 国内成人精品亚洲日本语音 | 亚洲av永久中文无码精品综合| 免费国产成人高清视频网站| 2020国产精品亚洲综合网| 国产免费av一区二区三区| a视频免费在线观看| 国产日韩成人亚洲丁香婷婷| 国产亚洲精彩视频| 亚洲成av人在线视| 美女视频黄的全免费视频网站| 在线亚洲精品视频| 97亚洲熟妇自偷自拍另类图片 | 巨胸喷奶水视频www免费视频| 亚洲一区二区在线免费观看| 午夜成人免费视频| 97无码人妻福利免费公开在线视频| 亚洲av无码一区二区三区观看| 2015日韩永久免费视频播放|