`

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

阅读更多

1. 存储过程返回游标

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

 

分享到:
评论

相关推荐

    SqlServer存储过程、游标讲解

    游标是SqlServer中一种非常重要的数据库对象,它的作用是允许逐行访问由SQL Server返回的结果集。结果集通常包括多行数据,而游标则能够让用户以程序的方式逐行处理这些数据。在实际应用中,游标能够提供很多有用的...

    SQL SERVER中的存储过程和游标的使用大综合

    在SQL Server中,存储过程和游标是两个重要的数据库编程元素,它们对于数据操作和管理起着关键作用。本文将深入探讨这两个概念,以及如何在实际应用中有效地使用它们。 **存储过程(Stored Procedures)** 存储...

    sqlserver游标存储过程的使用

    在Java中,你可以通过CallableStatement对象调用存储过程,然后使用ResultSet对象作为游标处理返回的结果。 总结,SQL Server中的游标和存储过程的结合使用,为我们提供了一种灵活处理大量数据的方式。在存储过程中...

    sql server 2008 存储过程示例带游标

    下面将详细解析标题“sql server 2008 存储过程示例带游标”所涉及的知识点,包括存储过程的创建、游标的使用以及SQL Server 2008中的特性。 ### 存储过程 存储过程是预编译的SQL语句集合,存储在数据库服务器上,...

    SQLServer数据库游标和函数的使用(经典)

    在SQL Server中,数据库游标和函数是两个非常重要的概念,它们在数据处理和数据库操作中扮演着不可或缺的角色。游标允许我们逐行处理查询结果,而函数则提供了丰富的计算和逻辑处理能力。 首先,让我们深入理解SQL ...

    存储过程和游标

    在数据库管理领域,存储过程和游标是两个重要的概念,它们在数据操作和处理中扮演着不可或缺的角色。这里,我们将深入探讨这两个主题,以便更好地理解它们的功能、用途以及如何在实际开发中应用。 首先,存储过程...

    SQL Server遍历表中记录的2种方法(使用表变量和游标)

    表变量在SQL Server中是一种临时存储数据的结构,它与临时表相似但作用范围更小,仅限于当前批处理或存储过程。以下是一个使用表变量的例子: ```sql DECLARE @temp TABLE (id INT IDENTITY(1, 1), Name VARCHAR(10...

    在SQLSERVER2005下操作游标

    在SQL Server 2005中,游标提供了一种灵活的方式,让我们能够按需处理数据,尤其是在需要对结果集进行迭代操作,如逐行更新、删除或逐行处理复杂逻辑时。下面我们将深入探讨在SQL Server 2005中操作游标的详细步骤和...

    如何编写SQL Server存储过程的详尽学习资料

    总之,学习SQL Server存储过程涉及到T-SQL语法、游标操作、事务管理和XML处理等多个方面。通过阅读电子书,参考案例代码,不断实践和优化,你将能够掌握这一强大的数据库工具,提升你的数据库开发和管理技能。

    sql server 游标试用方法 例子

    在SQL Server中,游标是一种数据处理工具,它允许我们逐行处理查询结果集,而不仅仅是一次性返回所有数据。游标对于那些需要按顺序处理数据、分步操作或逐条检查结果的应用场景非常有用。本篇文章将深入探讨SQL ...

    oracle到sqlserver存储过程语法转换

    ### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...

    SQL SERVER 存储过程学习笔记

    这篇学习笔记将深入探讨SQL Server存储过程的基本概念、创建、执行以及其在数据库开发中的应用。 一、存储过程的基本概念 存储过程是数据库中的一个对象,由一系列的SQL语句、控制流语句(如IF-ELSE,WHILE)和变量...

    sqlserver --游标 实现数据分页

    在给定的代码示例中,作者通过创建一个存储过程`proc_cursor`来实现基于游标的分页功能,这种方法虽然在某些场景下可能不如其他方法高效,但在理解SQL Server游标和分页原理方面提供了很好的学习材料。 ### 数据库...

    SQL SERVER数据库开发之存储过程应用.rar

    总而言之,"SQL SERVER数据库开发之存储过程应用"教程会涵盖以上这些核心概念,并可能深入到高级主题,如动态SQL、游标、异常处理、临时表和变量的使用等。通过学习和实践,开发者可以提升在SQL Server环境下的...

    SQLserver存储过程语法及实例

    在探讨SQL Server存储过程的相关知识点之前,首先需要明确存储过程的定义。存储过程是一组为了完成特定功能的SQL语句集合,它可以接受输入参数并可返回输出参数,还可以包含逻辑控制流程,比如条件判断、循环、分支...

    游标 和 存储过程的创建 及 在程序中的调用

    游标和存储过程是数据库管理中非常重要的两个概念,它们在数据处理和应用程序开发中扮演着关键角色。本文将详细探讨这两个概念,以及如何在程序中创建和调用它们。 首先,我们来看“游标”(Cursor)。游标提供了一...

    SQL Server存储过程编程经验技巧

    "SQL Server存储过程编程经验技巧" 本文将详细介绍SQL Server存储过程编程经验技巧,涵盖了SQL Server存储过程的基本概念、编写技巧和注意事项等内容。同时,本文也将对SQL Server存储过程的应用场景和优化方法进行...

    最简单的SQL Server数据库存储过程分页

    本文介绍一种简单且高效的SQL Server存储过程实现分页的方法,这种方法仅需提供SQL语句、每页的记录数以及当前页数即可快速完成分页操作。 #### SQL Server存储过程分页原理 在SQL Server中,通过存储过程实现分页...

Global site tag (gtag.js) - Google Analytics