`

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

 

分享到:
评论

相关推荐

    SQL+Server的事务、游标、存储过程及触发器.doc

    okcnw内容提要:本文将讲述数据库的四个重要概念:事物、游标、存储过程以及触发器。主要内容包括事务的概念及函数...存储过程是保存起来的可以接受和返回用户提供的参数的SQL语句的集合。触发器是一种特殊的存储过程,

    游标嵌套 STATUS 异常 存储过程

    一个存储过程的示例,简单展示了如下方面: 1,异常处理,事务回滚。 2,错误消息返回。 3,游标嵌套。 4,对于嵌套游标STATUS的互相影响问题的解决办法《注意001和002的注释位置,fetch的位置》。 对于初学者,...

    SQL Server的通用分页存储过程 未使用游标,速度更快!

    在这方面,JDBC就强悍得多,它可以将指定的行数和SQL请求一并发送给SQL Server,这样只返回分页后的数据,JDBC的原理还不清楚,但在实际使用中,速度还是非常快的 如果没办法使用JDBC,最常用的方法就是存储过程了!...

    分页存储过程(二)在sqlserver中返回更加准确的分页结果

    在我的使用SQL Server2005的新函数构造分页存储过程中,我提到了使用ROW_NUMBER()函数来代替top实现分页存储过程。 但是时间长了,又发现了新问题,就是主子表的分页查询。例如:订单表和订单明细表,要求是查询订单...

    实验四 存储过程、触发器与索引

    (2)使用“实验一”中的数据库“abc”,创建一个带有输入参数的存储过程proc_abc,查询指定职工的销售记录,用户输入职工编号,存储过程返回职工名称、产品名称、销售日期、销售数量,假如执行存储过程时所提供的...

    精通SQL 结构化查询语言详解

    15.3 SQL Server中的存储过程和函数  15.3.1 系统存储过程  15.3.2 使用CREATE PROCEDURE创建存储过程 15.3.3 使用EXECUTE语句调用存储过程  15.3.4 使用CREATE FUNCTION创建函数  15.3.5 使用Enterprise ...

    Sql语言学习全套-给力推荐

    SQLServer应用程序中的高级SQL注入.tx SQL_ppt sql语句.txt trancount.sql Trigger Test.sql trigger transaction.sql T_sql示例.sql UDF在层次型数据处理中的妙用.txt 《SQL 参考手册》中文版.chm 下线数...

    存储过程的安全及性能优化

     编写好后使用SQLServer的固定角色sysadmin注册该扩展存储过程,并将执行权限授予其它用户,这个扩展存储过程只能添加到master数据库。  在编写扩展存储过程中可能要用到某些系统存储过程,这些系统存储过程如下:...

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别.doc

    SP_EXECUTESQL 是在 SQL 2005中引入的新的系统存储过程,也是用来处理动态SQL 语句的。它比EXEC 更加灵活,首先也执行一下第一次的拼接SQL语句: DECLARE @TableName NVARCHAR(50),@Sql NVARCHAR(MAX),@Score INT; ...

    精通SQL--结构化查询语言详解

    15.3 sql server中的存储过程和函数 308 15.3.1 系统存储过程 308 15.3.2 使用create procedure创建存储过程 309 15.3.3 使用execute语句调用存储过程 310 15.3.4 使用create function创建函数 312 15.3.5 使用...

    如何使用游标和sys.objects清空SQL Server 2005数据库(删除所有表,存储过程,视图和UDF)

    sys.objects是SQL Server 2005中的系统视图,对于每个SQL数据库都有一个单独的sys.object视图,该视图存储在数据库本身中。使用Sys.objects返回所有数据库对象及其类型,类型的列表是以下给出的任何一个:DB OBJECT ...

    精通sql结构化查询语句

    以SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...

    SQL Server 2008 存储过程示例

    --有输入参数的存储过程-- create proc GetComment (@commentid int) as select * from Comment where CommentID=@commentid --有输入与输出参数的存储过程-- create proc GetCommentCount @newsid int, @count int ...

    Oracle 存储过程教程

    在Oracle的存储过程中返回记录集,需要用到游标变量,Oracle不能像sqlserver那样可以直接返回一个记录集。 由于设想在.net中把复杂的sql语句生成,所以在存储过程中没有去考虑生成sql语句的问题。 以下是在Oracle中...

    SQL 存储过程基础语法之一

    CREATE PROCEDURE 创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用...

    分页存储过程(三)在sqlserver中打造更加准确的分页结果

    昨天的那篇分页存储过程(二)在MS SQL Server中返回更加准确的分页结果 中使用了游标,有很多热心的朋友参与讨论,感谢大家的参与。

    SQL Server优化50法汇总

    查询速度慢的原因很多,常见如下几...9.返回了不必要的行和列 10.查询语句不好,没有优化可以通过如下方法来优化查询 :1.把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL200

    PL/SQL Developer8.04官网程序_keygen_汉化

    如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...

    PLSQLDeveloper下载

    如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...

    Sql server2005 优化查询速度50个方法小结

    可以通过如下方法来优化查询 : 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。 2、纵向、横向分割表,减

Global site tag (gtag.js) - Google Analytics