`
niuka
  • 浏览: 51666 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个sql游标使用例子

阅读更多

     前几天要处理一批数据,发现使用表连接,或者子查询都很难解决客户的需求,所以后来只能使用sql游标,加sql程序块来处理。

    我想自己以后用得着。

begin try
    begin transaction;

    declare @currentTime            datetime;
    select @currentTime = sysdate from (select Getdate() as sysdate) sys;
    declare @var_userID int
    declare @var_currentUserPoint int   --当前用户可用积分
    declare @var_Total2012Point int   --2012年总积分
    declare @var_Admin2012Point int   --2012管理员调整积分
    declare @var_Userd2012Point int   --2012使用积分
    declare @var_Total2013Point int   --2013年总积分
    declare @var_Admin2013Point int   --2013管理员调整积分
    declare @var_Userd2013Point int   --2013使用积分
    declare @var_currentPoint int --应保留积分
    declare @var_cleanPoint int --应扣除积分
    
    declare cursor_user CURSOR 
 FOR select u.UserId, u.Point
          from UserInfo u
         where u.DepartmentId=2 
         and u.DepartmentPropertyId in (4,12)--客户类型工业市场客户、分销商
         and u.UserId not in (10000046,10000208,10000209,10000222,10000223)

  
 OPEN cursor_user 

 --循环处理积分
 FETCH NEXT FROM cursor_user 
  INTO @var_userID, @var_currentUserPoint
 while @@FETCH_STATUS = 0
  begin
    --2012年总积分
        select @var_Total2012Point = isnull(sum(quantity*point),0) from BuyHistory where userid = @var_userID  and ( buydate >= '2012-01-01 00:00:00' and buydate <= '2012-12-31 23:59:59') and ProductName !='部门管理员调整积分'
     --2012管理员调整积分
         select @var_Admin2012Point = isnull(sum(quantity*point),0)  from BuyHistory where userid = @var_userID and ( buydate >= '2012-01-01 00:00:00' and buydate <= '2012-12-31 23:59:59') and ProductName ='部门管理员调整积分'
         --2012使用积分
      select @var_Userd2012Point = isnull(sum(Quantity*point),0) from RedemptionDetail where RedemptionID in (select RedemptionID from GiftRedemption where userId = @var_userID and statusNumber not In ( '100003','100007')  and  redemptionDate >= '2012-01-01 00:00:00' and redemptionDate <= '2012-12-31 23:59:59' )
     --2013总积分
     select @var_Total2013Point = isnull(sum(quantity*point),0)  from BuyHistory where userid = @var_userID  and ( buydate >= '2013-01-01 00:00:00' and buydate <= '2013-12-31 23:59:59') and ProductName !='部门管理员调整积分'
     --2013管理员调整积分
        select @var_Admin2013Point = isnull(sum(quantity*point),0) from BuyHistory where userid = @var_userID and ( buydate >= '2013-01-01 00:00:00' and buydate <= '2013-12-31 23:59:59') and ProductName ='部门管理员调整积分'
        --2013 使用积分
        select @var_Userd2013Point = isnull(sum(Quantity*point),0) from RedemptionDetail where RedemptionID in (select RedemptionID from GiftRedemption where userId = @var_userID and statusNumber not In ( '100003','100007')  and  redemptionDate >= '2013-01-01 00:00:00' and redemptionDate <= '2013-12-31 23:59:59' )
            -- Add BuyHistory 
     --计算公式 当前可用积分=当前用户积分-(当前总积分-2012年总积分-2012年管理员调整-2013年总积分-2013年调整+2012年使用积分+2013年使用积分)
     --要扣除的积分
    set @var_cleanPoint = @var_currentUserPoint - @var_Total2012Point - @var_Admin2012Point- @var_Total2013Point - @var_Admin2013Point+ @var_Userd2012Point+@var_Userd2013Point
    if @var_cleanPoint<=0 set @var_cleanPoint =0
    --计算要保留积分
    set @var_currentPoint = @var_currentUserPoint - @var_cleanPoint
     -- Add PointAdjust
      insert BuyHistory(
                   BuyDate,
                   Quantity,
                   ProductName,
                   SubmitDate,
                   Unit,
                   Remark,
                   Point,
                   UserId,
                   Price,
                   Type,
                   TotalPoint
                 )
           Values( @currentTime, 
                   1,
                   '部门管理员调整积分',
                   @currentTime,
                   '次',
                   '',
                   -@var_cleanPoint,
                   @var_userID,
                   0,
                   100002,
                   -@var_currentUserPoint
                 )
            insert PointAdjust(
                   Remark,
                   Point,
                   UserId,
                   AdjustDate
                 )
           Values( '管理员调整',
                   -@var_cleanPoint,
                   @var_userID,
                   @currentTime
                 )
             
             -- Update UserInfo
             update UserInfo 
                set Point = @var_currentPoint
              where DepartmentId=2
                and UserId = @var_userID 
     print @var_userID
             -- Update UserInfo
             FETCH NEXT FROM cursor_user 
    INTO @var_userID, @var_currentUserPoint
  end  
 CLOSE cursor_user
 DEALLOCATE cursor_user
   
    commit transaction;
end try
begin catch
        print @@TRANCOUNT
        -- Rollback any active OR uncommittable transactions before
        if @@TRANCOUNT > 0
        rollback transaction;
end catch

   

分享到:
评论

相关推荐

    SQL游标使用例子--有注释

    本文将通过一个具体的示例来详细介绍如何使用SQL游标,并解释其背后的原理与应用场景。 #### 二、SQL游标的定义与作用 游标允许我们在查询结果集中逐行操作数据,而不是一次性获取所有记录。这对于处理大量数据或...

    多个ORACLE 游标+SQL 游标 小例子+帮助文档

    以下是一个基本的显式游标使用示例: ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name; var1 datatype1; var2 datatype2; BEGIN OPEN cursor_name; LOOP FETCH cursor_...

    oracle数据库游标使用例子

    例如,在示例中,游标`cur_para`接收一个`varchar2`类型的参数`id`,并根据该参数查询`books_name`。 5. **使用FOR循环的游标**: 在示例3中,使用`FOR`循环简化了游标处理。在这种情况下,无需显式调用`OPEN`、`...

    SQL编程中的游标的使用方法

    1. **声明游标**:使用`DECLARE`语句声明一个游标,并指定该游标将执行的SQL查询语句。 2. **打开游标**:使用`OPEN`语句打开游标,使系统准备执行查询并获取第一行数据。 3. **从游标中获取数据**:使用`FETCH`语句...

    SQL Server2000游标例子

    本文主要探讨了在SQL Server 2000中如何利用游标处理数据,并通过一个具体的示例来展示游标的使用方法。 #### 核心知识点解析 ##### 1. 游标简介 在SQL Server 2000中,游标是一种用于处理结果集中的行的机制。它...

    sql server 游标试用方法 例子

    1. **声明游标**:首先,我们需要声明一个游标,指定其返回的数据源、游标类型、是否可滚动以及默认值。 ```sql DECLARE @myCursor CURSOR; SET @myCursor = CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM ...

    sql 游标遍历 实例

    在"插入用户.sql"这个文件中,可能包含了一个使用游标的脚本,用于逐条处理用户数据并插入到某个用户表中。这可能是一个批量插入操作,特别是在没有批量插入功能或为了确保插入顺序时非常实用。例如,假设我们有一个...

    Sql游标使用

    除了基本的游标使用,例子中还展示了一个更复杂的场景,创建了两个临时表`#Temp1`和`#Temp2`,然后通过游标来合并数据。在游标操作中,如果`#Temp2`已经存在与当前`#Temp1`中`deptid`相同的记录,那么就在`#Temp2`的...

    sql游标 cursor

    这里,`d_cursor`被定义为一个游标,用于从`Members`表中选择`IdCardNO`列的数据。 #### 二、打开游标 在声明了游标之后,我们需要通过`OPEN`命令来激活游标,使其准备好读取数据。打开游标的语法为: ```sql ...

    游标 ms sql 例子

    游标 ms sql 例子----- 大概模式 临时表使用等-——---

    sqlserver游标

    sqlserver游标的写法例子,sqlserver游标的写法例子,

    MS SQL Server2005存储过程、游标、游标嵌套综合例子

    游标嵌套是指在一个游标内部使用另一个游标,这在处理复杂的数据逻辑时非常有用。例如,你可以先遍历一个表,然后对每个记录再进行更复杂的子查询。嵌套游标需谨慎使用,因为它们可能导致性能下降,尤其是在处理大量...

    ORACLE 游标使用示例

    以下是一个简单的游标声明和使用的例子: ```sql DECLARE -- 声明变量来存储游标结果 v_emp_id NUMBER; v_emp_name VARCHAR2(50); -- 定义游标 CURSOR emp_cursor IS SELECT employee_id, first_name FROM ...

    当时自己初学SQL时,对游标很难理解,现在编写了一个实例游标循环,到时写SQL循环时方便些

    本文将通过一个具体的SQL游标的使用示例来深入探讨其工作原理及应用技巧。 #### 二、游标概念概述 游标(Cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以通过...

    VB链接sql使用游标和存储

    在VB(Visual Basic)编程中,连接SQL数据库并利用...总结,VB通过ADO连接SQL数据库,使用游标可以高效处理结果集,而存储过程则能提升性能和安全性。理解并熟练运用这些技术,对于任何VB开发者来说都是至关重要的。

    SQL游标

    SQL游标是数据库管理系统中一个重要的概念,尤其在SQL Server中,它允许用户按需处理数据集中的每一行。游标提供了对结果集的前进、后退、读取和修改等操作的能力,使得程序员可以逐行处理数据,而不仅仅是一次性...

    Oracle游标使用详解

    在这个例子中,我们首先创建一个名为`PROC_STU1`的过程,它包含一个明确游标`cur_stu`,用于查询`STUDENT`表中的学生编号和姓名,并按照学生编号排序。然后,我们使用`WHILE`循环来遍历游标中的每一行数据,并打印...

    mysql游标存储过程例子

    根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...

Global site tag (gtag.js) - Google Analytics