亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

從一個小例子認識SQL游標

系統 2390 0
原文: 從一個小例子認識SQL游標

1 ? ?什么是游標:

關系數據庫中的操作會對整個行集起作用。 例如,由 SELECT 語句返回的行集包括滿足該語句的 WHERE 子句中條件的所有行。 這種由語句返回的完整行集稱為結果集。 應用程序,特別是交互式聯機應用程序,并不總能將整個結果集作為一個單元來有效地處理。 這些應用程序需要一種機制以便每次處理一行或一部分行。 游標就是提供這種機制的對結果集的一種擴展。

游標通過以下方式來擴展結果處理:

  • 允許定位在結果集的特定行。
  • 從結果集的當前位置檢索一行或一部分行。
  • 支持對結果集中當前位置的行進行數據修改。
  • 為由其他用戶對顯示在結果集中的數據庫數據所做的更改提供不同級別的可見性支持。
  • 提供腳本、存儲過程和觸發器中用于訪問結果集中的數據的 Transact-SQL 語句。 ?

——MSDN

不難理解,游標與其他數據庫操作的最大不同就是對象是單條記錄而不是結果集,一般用于過程化程序里嵌入的SQL語句。在數據庫服務程序里用到了自動隱含創建的游標。

?

2 ? ?基本用法:

2.1 聲明游標

DECLARE 游標名 CURSOR

FOR SELECT語句

2.2 打開游標

OPEN 游標名

2.3 從游標獲取數據

FETCH NEXT FROM 游標名 [ INTO FETCH_LIST ]

從游標獲取數據需要注意可能到達游標末尾,以下方法解決這個問題以避免用戶在關閉游標時產生錯誤

      
         1
      
      
        BEGIN
      
      
         2
      
      
        DECLARE
      
      
        @custname
      
      
        VARCHAR
      
      (
      
        20
      
      
        )


      
      
         3
      
      
        DECLARE
      
       namecursor 
      
        CURSOR
      
      
        FOR
      
      
        SELECT
      
       CUST_NAME 
      
        FROM
      
       TBL_CUSTOMER 
      
        OPEN
      
      
         namecursor


      
      
         4
      
      
        FETCH
      
      
        NEXT
      
      
        FROM
      
       namecursor 
      
        INTO
      
      
        @custname
      
      
         5
      
      
        WHILE
      
       (
      
        @@FETCH_STATUS
      
      
        <>
      
      
        -
      
      
        1
      
      
        )


      
      
         6
      
      
        BEGIN
      
      
         7
      
      
        IF
      
       (
      
        @@FETCH_STATUS
      
      
        <>
      
      
        -
      
      
        2
      
      
        )


      
      
         8
      
      
        BEGIN
      
      
         9
      
      
        --
      
      
        操作游標變量
      
      
        10
      
      
        END
      
      
        11
      
      
        FETCH
      
      
        NEXT
      
      
        FROM
      
       namecursor 
      
        INTO
      
      
        @custname
      
      
        12
      
      
        END
      
      
        13
      
      
        CLOSE
      
      
         namecursor


      
      
        14
      
      
        DEALLOCATE
      
      
         namecursor


      
      
        15
      
      
        END
      
    

2.4 關閉游標

CLOSE 游標名

關閉后不能對游標進行讀取等操作,但可以使用OPEN語句再次打開

2.5 釋放游標

DEALLOCATE 游標名

即刪除游標,不可再使用

?

3 ? ?一個有意思的小例子:

雖然知道了游標的概念和基本用法,但對于什么時候用游標還很模糊,甚至誤認為游標可以被子查詢所代替。直到遇到了這個有意思的小例子:

表結構如下:

從一個小例子認識SQL游標

題目要求是: 列出從事同一種工作但屬于不同部門的雇員的不同組合

即如下結果:

從一個小例子認識SQL游標

在想盡了子查詢、表連接、建臨時表等等辦法之后,我發現我遇到了一個不可逾越的障礙:無法排除兩個名字組合的唯一性。即:我得到的結果可能是如下

ANAME BNAME
Adams James
James Adams

?

?

?

最終我想到了剛學到的游標,代碼如下

      
         1
      
      
        SELECT
      
       A.Ename 
      
        AS
      
       ANAME, B.Ename 
      
        AS
      
      
         BNAME


      
      
         2
      
      
        INTO
      
      
         #t


      
      
         3
      
      
        FROM
      
      
         EMP A


      
      
         4
      
      
        JOIN
      
      
         EMP B 


      
      
         5
      
      
        ON
      
       A.job 
      
        =
      
       B.job 
      
        AND
      
       A.deptNo 
      
        <>
      
       B.deptNo 
      
        and
      
       A.Ename
      
        <>
      
      
        b.Ename


      
      
         6
      
      
        ORDER
      
      
        BY
      
      
         ANAME


      
      
         7
      
      
         8
      
      
        DECLARE
      
       TEST_CURSOR 
      
        CURSOR
      
      
        FOR
      
      
         9
      
      
        SELECT
      
       ANAME, BNAME 
      
        FROM
      
      
         #t


      
      
        10
      
      
        11
      
      
        OPEN
      
      
         TEST_CURSOR


      
      
        12
      
      
        DECLARE
      
      
        @ANAME
      
      
        VARCHAR
      
      (
      
        20
      
      
        )


      
      
        13
      
      
        DECLARE
      
      
        @BNAME
      
      
        VARCHAR
      
      (
      
        20
      
      
        )


      
      
        14
      
      
        15
      
      
        FETCH
      
      
        NEXT
      
      
        FROM
      
       TEST_CURSOR 
      
        INTO
      
      
        @ANAME
      
      , 
      
        @BNAME
      
      
        16
      
      
        DELETE
      
      
        FROM
      
       #t 
      
        WHERE
      
       ANAME
      
        =
      
      
        @BNAME
      
      
        AND
      
       BNAME
      
        =
      
      
        @ANAME
      
      
        17
      
      
        WHILE
      
      
        @@FETCH_STATUS
      
      
        =
      
      
        0
      
      
        18
      
      
        BEGIN
      
      
        19
      
      
        FETCH
      
      
        NEXT
      
      
        FROM
      
       TEST_CURSOR 
      
        INTO
      
      
        @ANAME
      
      , 
      
        @BNAME
      
      
        20
      
      
        DELETE
      
      
        FROM
      
       #t 
      
        WHERE
      
       ANAME
      
        =
      
      
        @BNAME
      
      
        AND
      
       BNAME
      
        =
      
      
        @ANAME
      
      
        21
      
      
        END
      
      
        22
      
      
        23
      
      
        CLOSE
      
      
         TEST_CURSOR


      
      
        24
      
      
        DEALLOCATE
      
      
         TEST_CURSOR


      
      
        25
      
      
        26
      
      
        SELECT
      
      
        *
      
      
        FROM
      
       #t
    

最終得到了預期結果,但我想這個問題可能不止這一種解法,希望有其他解法的大牛能指點一二 ^^

從一個小例子認識SQL游標


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产亚洲精品久久久久久久软件 | 91在线激情在线观看 | 久久狠色噜噜狠狠狠狠97 | 国产精品成人第一区 | 成人久久视频 | 不卡免费播放 | 视色视频 | 天天干妹子 | 亚洲国产精品xo在线观看 | 国产精品嫩草影院奶水 | 久久久香蕉视频 | 自拍视频国产 | 波多野结衣中文字幕一区 | 日本大片免a费观看在线 | 真实的国产乱xxxx | 欧美黄色网页 | 亚洲国产欧美在线观看 | 日产精品久久久一区二区 | 欧美在线一区二区 | 91九色麻豆 | 综合欧美日韩一区二区三区 | 爱操影院 | 国内主播大秀福利视频在线看 | 久久午夜影视 | 亚洲精品另类 | 免费香蕉依人在线视频久 | 999热在线精品观看全部 | 久久不见久久见免费影院 | 久久福利影院 | 日韩视频不卡 | 天天摸日日摸 | 日日天干夜夜人人添 | 国产国拍亚洲精品午夜不卡17 | 欧美日韩一区二区亚洲 | 免费人成在线观看网站 | 成年女人免费看 | 欧美一级全部免费视频 | 香蕉在线精品一区二区 | 久久精品国产久精国产 | 成人精品视频在线观看 | 四虎www成人影院观看 |