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

從一個小例子認識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條評論
主站蜘蛛池模板: 色偷偷亚洲第一成人综合网址 | 亚洲男人的天堂久久香蕉网 | 日韩一区国产二区欧美三 | 日韩在线一区二区三区 | 国产福利视频一区二区三区 | 这里只有精品视频在线 | 国内精品久久久久久久星辰影视 | 天天视频国产精品 | 美女一级毛片免费不卡视频 | 秒播影视 午夜福利毛片 | 综合欧美视频一区二区三区 | 中国欧美一级毛片免费 | 青草久久精品 | 国产日韩欧美亚洲综合首页 | 在线成人国产 | 最新中文字幕日本 | 99久久99这里只有免费费精品 | 香蕉综合在线 | 美女福利视频一区二区 | 久久这里精品 | 日韩欧美一二三区 | 修修视频在线观看 | 91麻豆精品国产91久久久久久 | 在线播放精品视频 | 色偷偷亚洲精品一区 | 综合 欧美 国产 视频二区 | 久久国产欧美日韩高清专区 | 综合久久网 | heyzo在线播放4k岛国 | 国内精品视频在线观看 | 国产一区二区在线免费观看 | chinese国产一区二区 | 国产香蕉在线视频一级毛片 | h在线免费视频 | 成人小视频免费在线观看 | 黑人超长巨大xxxxxxx视频 | 五月婷婷久 | 一本一本久久a久久精品综合麻豆 | 动漫美女h片黄动漫在线观看 | 久草最新网址 | 爱爱爱久久久久久久 |