(一)淺談游標

      1)游標的概念

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

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

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

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

    (2)淺談游標

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

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

(二)使用游標

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

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

       ●聲明游標

       ●打開游標

       ●從游標中操作數據

       ●關閉游標

      下面我們主要講述下服務器游標:

      1)定義游標

         使用游標之前必須先聲明它。聲明指定定義游標結果集的查詢。通過使用for updatefor 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,則沒有行返回。必須為整型常量且 @nvar 必須為smallinttinyint  int

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

      舉例:

       Fetch  next

       company_crsr into @name,@salary

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

    值意義:

             0——Fetch語句成功

             1——Fetch語句導致一錯誤

             2——結果集沒有更多的數據,當前位置位于結果集最后一行,而客戶對該游標仍發出Fetch語句時。

     若游標是可更新的,可用updatedelete語句來更新和刪除行。

     刪除游標當前行的語法為:

                      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操作。