zoukankan      html  css  js  c++  java
  • Sql Server系列:游标

    1. 游标简介

      游标是一种处理数据的方法,主要用于存储过程、触发器和Transact-SQL脚本中。SELECT语句返回的是一个结果集,游标能够从包含多条数据记录的结果集中每次提取一条记录。

      游标的特点:

      ◊ 允许对由SELECT查询语句返回的行集中的每一行执行相同或者不同的操作,而不是对整个集合执行同一个操作。

      ◊ 提供对基于游标位置的表中的行进行删除和更新。

    2. 游标的基本操作

    2.1 声明游标

      声明游标语法:

    ISO Syntax
    DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR 
         FOR select_statement 
         [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
    [;]
    Transact-SQL Extended Syntax
    DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] 
         [ FORWARD_ONLY | SCROLL ] 
         [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
         [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
         [ TYPE_WARNING ] 
         FOR select_statement 
         [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
    [;]

    2.2 打开游标

      在使用游标之前,必须打开游标。

      打开游标的语法格式:

    OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }

    2.3 读取游标中的数据

      打开游标之后,可以读取游标中的数据。FETCH用来读取游标中的某一行数据。

      FETCH语句的语法格式:

    FETCH 
              [ [ NEXT | PRIOR | FIRST | LAST 
                        | ABSOLUTE { n | @nvar } 
                        | RELATIVE { n | @nvar } 
                   ] 
                   FROM 
              ] 
    { { [ GLOBAL ] cursor_name } | @cursor_variable_name } 
    [ INTO @variable_name [ ,...n ] ] 

    2.4 关闭游标

      在不使用游标的时候,可以将其关闭,以释放游标所占用的服务器资源。

      关闭游标CLOSE语法格式:

    CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }

    2.5 释放游标

      游标操作的结果集空间虽然被释放了,但是游标结构本身也会占用一定的资源,所以在使用完游标之后,为了收回被游标占用的资源,应该讲游标释放。

      释放游标DEALLOCATE语法格式:

    DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }

    3. 游标应用

    3.1 使用游标变量

    DECLARE @CUR_Product CURSOR                        -- 声明游标变量
    
    DECLARE CUR_Product CURSOR FOR                     -- 创建游标
    SELECT [ProductID],[ProductName] FROM [dbo].[Product]
    
    OPEN CUR_Product                                   -- 打开游标
    SET @CUR_Product = CUR_Product                     -- 为游标变量赋值
    
    FETCH NEXT FROM @CUR_Product                       -- 从游标变量中读取值
    WHILE @@FETCH_STATUS = 0                           -- 判断FETCH语句是否获取到记录
        BEGIN
            FETCH NEXT FROM @CUR_Product               -- 读取游标变量中的数据
        END
    CLOSE @CUR_Product                                 -- 关闭游标
    DEALLOCATE @CUR_Product                            -- 释放游标

    3.2 使用游标为变量赋值

    DECLARE @ProductID INT
    
    DECLARE CUR_Product CURSOR FAST_FORWARD READ_ONLY FOR
    SELECT [ProductID] FROM [dbo].[Product]
    ORDER BY [ProductID] DESC
    
    OPEN CUR_Product
    FETCH NEXT FROM CUR_Product INTO @ProductID
    WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @ProductID
            FETCH NEXT FROM CUR_Product INTO @ProductID
        END
    CLOSE CUR_Product
    DEALLOCATE CUR_Product
    DECLARE @ProductID INT
    DECLARE @ProductName VARCHAR(50)
    
    DECLARE CUR_Product CURSOR FAST_FORWARD READ_ONLY FOR
    SELECT [ProductID],[ProductName] FROM [dbo].[Product]
    
    OPEN CUR_Product
    FETCH NEXT FROM CUR_Product INTO @ProductID,@ProductName
    WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT CONVERT(VARCHAR, @ProductID) + ' ' + @ProductName
            FETCH NEXT FROM CUR_Product INTO @ProductID,@ProductName
        END
    CLOSE CUR_Product
    DEALLOCATE CUR_Product
  • 相关阅读:
    项目开发问题笔记
    HDU 1800——Flying to the Mars——————【字符串哈希】
    FZU 2122 ——又见LKity——————【KMP字符串匹配】
    FZU 2122——又见LKity——————【字符串匹配、暴力】
    POJ 3468——A Simple Problem with Integers——————【线段树区间更新, 区间查询】
    HRBUST 1909——理工门外的树——————【离线处理,差分前缀和】
    HRBUST 1161——Leyni——————【线段树单点更新,区间查询】
    用Gvim建立IDE编程环境 (Windows篇)
    FZU 2207 ——以撒的结合——————【LCA + 记录祖先】
    HDU 5635 ——LCP Array ——————【想法题】
  • 原文地址:https://www.cnblogs.com/libingql/p/4165359.html
Copyright © 2011-2022 走看看