讓資料庫遊標變得簡單

來源:互聯網
上載者:User

(一)淺談遊標

      (1)遊標的概念

      遊標是指向查詢結果集的一個指標,它是一個通過定義語句與一條Select語句相關聯的一組SQL語句,即從結果集中逐一的讀取一條記錄。遊標包含兩方面的內容:

       ●遊標結果集:執行其中的Select語句所得到的結果集;

       ●遊標位置:一個指向遊標結果集內的某一條記錄的指標

       利用遊標可以單獨操縱結果集中的每一行。遊標在定義以後存在兩種狀態:關閉和開啟。當遊標關閉時,其查詢結果集不存在;只有當遊標開啟時,才能按行讀取或修改結果集中的資料。

    (2)淺談遊標

        
遊標我們可以通俗的解釋為變動的標示。正如它的解釋一樣,資料庫中的遊標其實也是一種讀取資料的方式。舉個簡單的例子來說:我有一個電話本,電話本上的號碼首先是按地區劃分的,現在我想找個家住廊坊的李四。首先我們要做的是先找到廊坊地區的電話表,找到後的表也即是我們上面所說的遊標結果集;而為了找到李四我們可能會用手一條一條逐行的掃過,以協助我們找到所需的那條記錄。對應於資料庫來說,這就是遊標的模型。所以,你可以這樣想象:表格是資料庫中的表,而我們的手好比是遊標。

       總結來說遊標就好比是在電話本上逐一掃描號碼的手指。

(二)使用遊標

       一個應用程式中可以使用兩種類型的遊標:前端(客戶)遊標和後端(伺服器)遊標,它們是兩個不同的概念。

       但無論使用哪種遊標,都必須經過如下的步驟:

       ●聲明遊標

       ●開啟遊標

       ●從遊標中操作資料

       ●關閉遊標

      下面我們主要講述下伺服器資料指標:

      (1)定義遊標

        
使用遊標之前必須先聲明它。聲明指定定義遊標結果集的查詢。通過使用for update或for read only關鍵詞將遊標顯式定義成可更新的或唯讀。

      Declare cursor_name  cursor

     For select_statement

     [for{read only|update[of colum_name_list]}]

      舉例:

      Declare  company_crsr cursor

      For select name,salary from company where salary>2000

      For update of name,salary

      上面我們聲明了一個名為company_crsr的遊標。

      (2)開啟遊標

         open的文法為:

                         open
遊標名

        在聲明遊標後,必須開啟它以便用fetch,update,delete讀取、修改、刪除行。在開啟一個遊標後,它將被放在遊標結果集的首行前,必須用fetch語句訪問該首行。

      (3)讀取遊標資料

      在聲明並開啟一個遊標後,可用fetch命令從遊標結果集中擷取資料行。

      Fetch的文法為:

           Fetch
[[Next | Prior | First | Last | Absolute{n|@nvar} |Relative {n|@nvar}]

         From]  遊標名 [into
變數列表]

      參數說明:

      Next:返回結果集中當前行的下一行,如果該語句是第一次讀取結果集中資料則返回的是第一行

      Prior:返回結果集中當前行的上一行,如果該語句是第一次讀取結果集中的資料則無記錄結果返回並把遊標位置設定為第一行。

      First:返回遊標第一行;Last:返回遊標中的最後一行;

      Absolute{n|@nvar}:如果 n
或 @nvar 為正數,返回從遊標題開始的第 n
行並將返回的行變成新的當前行。如果 n 或 @nvar
為負數,返回遊標尾之前的第 n 行並將返回的行變成新的當前行。如果 n
或 @nvar 為 0,則沒有行返回。n
必須為整型常量且 @nvar 必須為 smallint、tinyint
或 int。

      RELATIVE {n | @nvar}:如果 n
或 @nvar 為正數,返回當前行之後的第 n
行並將返回的行變成新的當前行。如果 n 或 @nvar
為負數,返回當前行之前的第 n 行並將返回的行變成新的當前行。如果 n
或 @nvar 為 0,返回當前行。如果對遊標的第一次提取操作時將 FETCH RELATIVE
的 n 或 @nvar
指定為負數或 0,則沒有行返回。n
必須為整型常量且 @nvar 必須為 smallint、tinyint
或 int。

      舉例:

       Fetch  next

       company_crsr into @name,@salary

      SQL Server在每次讀取後返回一個狀態值。可用@@sql_status訪問該值,下表給出了可能的@@sql_status值及其意義。

    值意義:

             0——Fetch語句成功

             1——Fetch語句導致一錯誤

             2——結果集沒有更多的資料,當前位置位於結果集最後一行,而客戶對該遊標仍發出Fetch語句時。

     若遊標是可更新的,可用update和delete語句來更新和刪除行。

     刪除遊標當前行的文法為:

                      Delete [from]
表名

                      where current of
遊標名

     舉例:delete from authors where current of authors_crsr

     當遊標刪除一行後,SQL Server將遊標置於被刪除行的前一行上。

     更新遊標當前行的文法為:

       update
表名

       set column_name1={expression1|NULL|(select_statement)}

              [,column_name2={expression2|NULL|(select_statement)}

              [……]

       where current of
遊標名

      舉例:

        update company

        set name=”張三”,salary=”5000”

        where current of company_crsr

    (4)關閉遊標

       當結束一個遊標結果集時,可用close關閉。該文法為:

           close
遊標名

       關閉遊標並不改變其定義,可用open再次開啟。若想放棄遊標,必須使用deallocate釋放它,deallocater的文法為:

        deallocater cursor
遊標名

        deallocater語句通知SQL Server釋放Declare語句使用的共用記憶體,不再允許另一進程在其上執行Open操作。

 

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.