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. 저장 프로시저가 커서를 반환합니다.

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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)