Home  >  Article  >  Database  >  游标cursor

游标cursor

WBOY
WBOYOriginal
2016-06-07 15:27:581672browse

SQL Server 用于处理数据集合。但很多时候,只需要处理一行数据。游标功能可以使我们获取一个数据行集,然后一次处理一行数据。 游标有5个组成部分。DECLARE用于定义一个Select语句,该语句生成游标中数据行。Open使Select语句执行,并将结果导入内存结构中

SQL Server 用于处理数据集合。但很多时候,只需要处理一行数据。游标功能可以使我们获取一个数据行集,然后一次处理一行数据。

游标有5个组成部分。DECLARE用于定义一个Select语句,该语句生成游标中数据行。Open使Select语句执行,并将结果导入内存结构中。Fetch用于从游标中一次获取一行。Close则用来关闭游标操作。Deallocate用于删除游标,然后重新分配之前存储游标结果集非让内存结构。

(Notice:如果写的游标在来自游标中每一行上的操作都相同,建议使用更高效的基于数据集的操作。)

声明游标的通用语法格式如下:

    Declare cursor_name CURSOR [ LOCAL | REMOTE ] 
               [ STATIC| KEYSET | DYNAMIC | FAST_FORWARD ]
               [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
               [TYPE_WARNING]
               FOR select_statement
接下来的语句展示了声明相同游标的三种不同的方法:
    Declare curproducts CURSOR FAST_FORWARD FOR
               SELECT ProductID, ProductName, ListPrice FROM Products.Product
    GO
    Declare curproducts CURSOR READ_ONLY FOR
               SELECT ProductID, ProductName, ListPrice FROM Products.Product
    GO
    Declare curproducts CURSOR  FOR
               SELECT ProductID, ProductName, ListPrice FROM Products.Product
    FOR READ ONLY
    GO
一旦游标被声明,就可以发布OPEN命令,就可以发布OPEN命令以执行SELECT语句。
    OPEN curproducts
然后就可以用FETCH语句从游标中的行获取数据。首次执行FETCH命令时,指针位于游标结果集的第一行数据处,再执行一次,指针边在游标中前进一行,直至超出游标结果集的范围。每次执行FETCH语句还会在全局变量@@FETCH_STATUS中放置一个值。可以使用WHILE循环来遍历游标,循环获取游标中的行。只要@@FETCH_STATUS为0,都可以使用WHILE循环。
    DECLARE @ProductID INT,
                   @ProductName VARCHAR(50),
                   @ListPrice MONEY
    DECLARE curproducts CURSOR FOR
        select ProductID,ProductName,ListPrice from Products.Product
    FOR READ ONLY
    OPEN curproducts
    FETCH curproducts into @ProductID,@ProductName,@ListPrice
    WHILE @@FETCH_STATUS = 0
    BEGIN
        Select @ProductID,@ProductName,@ListPrice
        FETCH curproducts into @ProductID,@ProductName,@ListPrice
    END
    CLOSE curproducts
    DEALLOCATE curproducts
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn