首页 php教程 PHP开发 SQLSERVER存储过程返回游标的处理

SQLSERVER存储过程返回游标的处理

Dec 14, 2016 am 11:59 AM

1. 存储过程返回游标

Sql代码 

USE [TEST_DB]  
GO  
  
/****** [PRT].[Move_Data_Return_Cursor]   Script Date: 03/08/2012 17:38:55 ******/  
SET ANSI_NULLS ON  
GO  
  
SET QUOTED_IDENTIFIER ON  
GO  
  
/*********************************************************************************  
*把数据从表 DATA_SOURCE_TABLE 移动到表 TEST_TABLE .  
返回游标供Move_Data_Handle_Cursor供Move_Data_Handle_Cursor存储过程使用.  
*DataServer: 110.110.110.110  
*DataBase:   TEST_DB  
*Name:       [Move_Data_Return_Cursor]  
*Function:     
*Input:      @overTimeHour INT  
*Output:       @CURSOR_PriceChangeRecord CURSOR  
*Creator:    GREATWQS 2012-02-23  
*Updated:    GREATWQS 2012-03-08  UPDATE NEW REQUIREMENT  
**********************************************************************************/  
ALTER PROCEDURE [PRT].[Move_Data_Return_Cursor]   
    -- Add the parameters for the stored procedure here   
    @overTimeHour INT,  
    @CURSOR_PriceChangeRecord CURSOR VARYING OUTPUT  
AS  
  
BEGIN  
      -- SET NOCOUNT ON added to prevent extra result sets from  
      -- interfering with SELECT statements.  
      SET NOCOUNT ON;  
          
      -- print @overTimeHour;  
        
      -- 1. 声明游标: DECLARE CURSOR_PriceChangeRecord  
      SET @CURSOR_PriceChangeRecord = CURSOR  
      FORWARD_ONLY  STATIC    
      FOR   
         SELECT ItemNo,  
                ItemName,  
                ItemColor,  
                ItemSize,  
                ItemMadeIn,  
                InDate   
         FROM   PRT.DATA_SOURCE_TABLE  WITH(NOLOCK)  
         WHERE  InDate > dateadd(HOUR, -@overTimeHour, getdate())  
         -- 在这里进行时间的限定.   
           
    -- 2. 打开游标  
    OPEN @CURSOR_PriceChangeRecord  
      
END
登录后复制

2. 存储过程处理返回游标

Sql代码

USE [TEST_DB]  
GO  
  
/****** [PRT].[Move_Data_RHandle_Cursor]  Script Date: 03/08/2012 17:39:27 ******/  
SET ANSI_NULLS ON  
GO  
  
SET QUOTED_IDENTIFIER ON  
GO  
  
/*********************************************************************************  
*把数据从表 DATA_SOURCE_TABLE 移动到表 TEST_TABLE  
*把游标中的数据,插入到表TEST_TABLE.  
*DataServer: 110.110.110.110  
*DataBase:   TEST_DB  
*Name:       [Move_Data_Handle_Cursor]  
*Function:     
*Input:      @overTimeHour INT  
*Output:       
*Creator:    GREATWQS 2012-02-23  
*Updated:    GREATWQS 2012-03-08  UPDATE NEW REQUIREMENT  
**********************************************************************************/  
ALTER PROCEDURE [PRT].[Move_Data_Handle_Cursor]   
    -- 超时时间(小时)  
    @overTimeHour INT  
AS  
BEGIN  
    -- SET NOCOUNT ON added to prevent extra result sets from  
    -- interfering with SELECT statements.  
    SET NOCOUNT ON;  
      
    DECLARE  
         -- 需要插入表TEST_TABLE,数据来源声明  
         @ItemNumber_Insert       CHAR(20),  
         @ItemName_Insert         CHAR(50),  
         @ItemColor_Insert        CHAR(10),  
         @ItemSize_Insert         CHAR(5),  
         @ItemWhereMadeIn_Insert  CHAR(20),  
         @createTime_Insert       DATETIME,  
         @changeTime_Insert       DATETIME,  
         @lastChangeTime_Insert   DATETIME,  
         @priority_Insert         INT,  
         @itemType_Insert         INT,  
         @active_Insert           INT,  
         -- ItemNumber Record num in table  
         @totalNum_SelectDB       INT,  
         @changeTime_SelectDB     DATETIME  
      
    -- Set Default Value  
    SET @ItemWhereMadeIn_Insert   = 0  
    SET @createTime_Insert        = getdate()  
    SET @lastChangeTime_Insert    = null  
    SET @priority_Insert          = 0  
    SET @itemType_Insert          = 0  
    SET @active_Insert            = 1  
      
    -- 1. 声明游标: 在过程内部自己定义有游标时,调用游标前面不加@符号  
    DECLARE @CURSOR_Result CURSOR  
        
    -- 2. 得到上个游标, 上个游标已经打开  
    EXEC Move_Data_Return_Cursor @overTimeHour,   
         @CURSOR_PriceChangeRecord = @CURSOR_Result OUTPUT  
        
    -- 3. 抓取游标中的数据: FETCH CURSOR_Result  
    FETCH NEXT  FROM  @CURSOR_Result  
    INTO  @ItemNumber_Insert,   
          @ItemName_Insert,   
          @ItemColor_Insert,   
          @ItemSize_Insert,   
          @changeTime_Insert  
      
    -- 4. 对游标中的每一个记录进行处理: 循环  
    WHILE (@@FETCH_STATUS = 0)  
    BEGIN    
         -- 查看此ItemNumber_Insert是否已经存在表中  
         SELECT TOP 1 @totalNum_SelectDB = COUNT(*)   
         FROM PRT.TEST_TABLE WITH(NOLOCK)  
         WHERE ItemNumber = @ItemNumber_Insert           
           
         -- 如果表不存在此@ItemNumber_Insert, 则插入  
         IF @totalNum_SelectDB = 0  
         BEGIN  
             INSERT INTO PRT.TEST_TABLE(  
                    [ItemNumber],  
                    [ItemName],  
                    [ItemColor],  
                    [ItemSize],  
                    [MadeIn],  
                    [createTime],  
                    [changeTime],  
                    [lastChangeTime],  
                    [priority],  
                    [itemType],  
                    [active])  
              VALUES (   
                    @ItemNumber_Insert,  
                    @ItemName_Insert,  
                    @ItemColor_Insert,  
                    @ItemSize_Insert,  
                    @ItemWhereMadeIn_Insert,  
                    @createTime_Insert,  
                    @changeTime_Insert,  
                    @lastChangeTime_Insert,  
                    @priority_Insert,  
                    @itemType_Insert,  
                    @active_Insert  
                   )  
         END  
         -- 如果此ItemNumber存在于表中  
         ELSE   
         BEGIN  
             -- 查看此ItemNumber_Insert的记录  
             SELECT TOP 1 @changeTime_SelectDB = changeTime  
             FROM PRT.TEST_TABLE WITH(NOLOCK)  
             WHERE ItemNumber = @ItemNumber_Insert  
               
             -- If item has exists in table, and changeTime<=newItem.changeTime   
             -- fresh the changeTime = newItem.changeTime, set active=1;  
             IF @changeTime_SelectDB < @changeTime_Insert    
             BEGIN  
                 UPDATE PRT.TEST_TABLE  
                 SET    changeTime = @changeTime_Insert,   
                        active = 1  
                 WHERE  ItemNumber = @ItemNumber_Insert  
             END  
         END  
           
         -- FETCH NEXT RECORD FROM @CURSOR_Result  
         FETCH NEXT  FROM  @CURSOR_Result  
         INTO  @ItemNumber_Insert,   
               @ItemName_Insert,   
               @ItemColor_Insert,   
               @ItemSize_Insert,   
               @changeTime_Insert  
    END  
      
    -- 5. 关闭游标  
    CLOSE @CURSOR_Result  
      
    -- 6. 删除游标  
    DEALLOCATE @CURSOR_Result      
      
    -- Delete overtime  item, set active=0:changeTime<getdate()-48;  
    UPDATE PRT.TEST_TABLE  
    SET    active=0  
    WHERE  changeTime < dateadd(HOUR, -@overTimeHour, getdate())  
      
END
登录后复制


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)