zoukankan      html  css  js  c++  java
  • CURSOR 游标使用示例

    --声明一个游标 
    DECLARE MyCursor CURSOR 
    FOR SELECT TOP 5 FBookName,FBookCoding FROM TBookInfo --定义一个叫MyCursor的游标,存放for select 后的数据 
    
    --打开一个游标
    OPEN MyCursor--即打开这个数据集 
    
    --循环一个游标 
    DECLARE @BookName nvarchar(2000),@BookCoding nvarchar(2000) 
    FETCH NEXT FROM MyCursor INTO @BookName,@BookCoding   --移动游标指向到第一条数据,提取第一条数据存放在变量中 
    WHILE @@FETCH_STATUS =0 --如果上一次操作成功则继续循环 
        BEGIN 
            print 'name'+@BookName 
            FETCH NEXT FROM MyCursor INTO @BookName,@BookCoding--继续提下一行 
        END 
    
    --关闭游标 
    CLOSE MyCursor 
    --释放资源 
    DEALLOCATE MyCursor 

    示例:游标嵌套游标的使用方法

     
    USE [NFGC_Workflow]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:Ben.Jiang
    -- Create date:2011/9/13
    -- Description:添加库存警告
    -- =============================================
    ALTER PROCEDURE [dbo].[Insert_AlltblStockLimit] 
        @Company NVARCHAR(50),
        @MaxEnable bit,
        @MinEnable bit,
        @Max NVARCHAR(50),
        @Min NVARCHAR(50),
        @MaxAlertAheadDays int,
        @MinAlertAheadDays int
    AS
    BEGIN
        DECLARE @CustomerCur CURSOR;--声明外层游标
        DECLARE @Id NVARCHAR(50),@ItemCode NVARCHAR(50),@customer NVARCHAR(50);
        --获取所有客户记录
        SET @CustomerCur=CURSOR FOR select distinct [cust-num] from(SELECT A.[cust-num],
                                    ISNULL(B.name,A.[name]) as name from dbo.Erp_custaddr a
                                     LEFT JOIN dbo.Erp_custaddr_CHS B ON A.[cust-num]=B.[cust-num] AND A.[cust-seq]=B.[cust-seq]
                                     where A.[credit-hold]='False' and A.[cust-seq]=0) as cust
                                     
        OPEN @CustomerCur --打开外层游标
        FETCH NEXT FROM @CustomerCur INTO @customer--提取外层游标行
        WHILE(@@FETCH_STATUS=0)
        BEGIN
        
            DECLARE @varCur CURSOR;--声明内层游标
            --获取每一个客户的商品记录
            SET @varCur = CURSOR FOR SELECT DISTINCT item FROM dbo.Erp_itemcust AS A INNER JOIN [Erp_ux-customer]
                                 AS B ON  A.[cust-num]=B.[cust-num]  AND B.[cust-num] IS NOT NULL   AND LEN(A.[cust-num])>0 AND B.[cust-seq]=0
                                 INNER JOIN Erp_imsAs AS C ON C.sItem=A.item AND C.sCust=A.[cust-num]  AND C.cActFlg = '0'
                                 WHERE  A.item IS NOT NULL  AND LEN(A.item)>0 AND  A.[cust-num]=@customer;
             
            OPEN @varCur --打开内层游标
            FETCH NEXT FROM @varCur INTO @ItemCode
            WHILE(@@FETCH_STATUS=0)
            BEGIN
            
            IF (exists(SELECT Id from tblStockLimit where Company=@Company and Custnum=@customer and ItemCode=@ItemCode))
                --存在该记录更新记录
                BEGIN
                SET @Id=(SELECT Id from tblStockLimit where Company=@Company and Custnum=@customer and ItemCode=@ItemCode)
                update tblStockLimit set MaxEnable=@MaxEnable,Max=case when @Max<>'' then @Max else null end,
                MaxAlertAheadDays=case when @MaxAlertAheadDays<>'' then @MaxAlertAheadDays else null end,
                MinEnable=@MinEnable,Min=case when @Min<>'' then @Min else null end,
                MinAlertAheadDays=case when @MinAlertAheadDays<>'' then @MinAlertAheadDays else null end where Id=@Id;
                END
            
            ELSE
                --不存在该记录新增记录
                BEGIN
                insert into tblStockLimit(Company,Custnum,ItemCode,MaxEnable,Max,MaxAlertAheadDays,MinEnable,Min,MinAlertAheadDays)
                values('NFGS',@customer,@ItemCode,@MaxEnable,case when @Max<>'' then @Max else null end,
                case when @MaxAlertAheadDays<>'' then @MaxAlertAheadDays else null end,@MinEnable,
                case when @Min<>'' then @Min else null end,case when @MinAlertAheadDays<>'' then @MinAlertAheadDays else null end);
                END
            
            FETCH NEXT FROM @varCur INTO @ItemCode--内层游标向下移动一行 
            END    
            CLOSE @varCur
            DEALLOCATE @varCur
            FETCH NEXT FROM @CustomerCur INTO @customer--内层游标结束后,外层游标继续向下移动一行 
        END
     
        CLOSE @CustomerCur
        DEALLOCATE @CustomerCur
    END
  • 相关阅读:
    Can you answer these queries?(HDU4027+势能线段树)
    Tunnel Warfare(HDU1540+线段树+区间合并)
    Computer(HDU2196+树形dp+树的直径)
    Anniversary party(树上dp+HDU1520)
    2018 Multi-University Training Contest 1-1002 -Balanced Sequence(括号匹配+贪心)
    暑假集训——cf热身赛部分题有感加其题解
    Educational Codeforces Round 47 (Rated for Div. 2) 题解
    计蒜客 Goldbach Miller_Rabin判别法(大素数判别法)
    多种方法过Codeforces Round #270的A题(奇偶法、打表法和Miller_Rabin(这个方法才是重点))
    Codeforces Round #494 (Div. 3)
  • 原文地址:https://www.cnblogs.com/Denghejing/p/9476300.html
Copyright © 2011-2022 走看看