zoukankan      html  css  js  c++  java
  • 以学生表实例来补充 触发器和游标操作

    这是学生表里面的内容:

    现在创建一个Avgtable表:

    select Sno, AVG(Grade) avgGrade into Avgtable from SC
    group by Sno

    --情况是这样子的:
    --当向SC表中做插入操作的时候,插入数据的时候 Avgtable表是要改变数据的:
    -- 1.当插入Avgtable表中目前没有的学生的数据的时候就直接插入
    -- 2.当插入Avgtable表中已经有的学生的数据的时候就要求要改变avgGrade的值
    --触发器做插入的时候:

    alter trigger tri_Test on SC for insert,delete
    as 
    if not exists(select * from Avgtable, inserted where Avgtable.Sno = inserted.Sno)
    insert into Avgtable select Sno, Grade from inserted
    else
    begin
    declare @Sno varchar(7)
    select @Sno = Sno from inserted
    update Avgtable
    set avgGrade = (select AVG(Grade) from SC where Sno = @Sno)
    where Sno = @Sno
    end


    --测试:
    insert into SC values ('2017001','2',88)


    --当插入多条记录的时候:
    insert into SC values
    ('2017004', '1', 90),
    ('2017004', '2', 80),
    ('2017004', '3', 40)

    为什么会出现错误?
    是因为当插入多条纪录的时候 触发器 中 inserted 表中会有三条记录
    if not exists(select * from Avgtable, inserted where Avgtable.Sno = inserted.Sno)
    这个条件刚好成立 然后就进入了 insert into Avgtable select Sno, Grade from inserted
    将会把inserted表中的三条纪录全部插入到Avgtable表中。

    解决办法就是使用游标:
    --创建触发器(使用游标):

    alter trigger tri_OnSC on SC for insert
    as 
    declare culInsert cursor for select Sno,Cno,Grade from SC
    open culInsert
    declare @Sno varchar(7), @Cno char(1), @Grade int 
    fetch next from culInsert into @Sno, @Cno, @Grade
    while @@FETCH_STATUS = 0
    begin 
    if not exists(select * from Avgtable where Sno = @Sno)
    insert into Avgtable values(@Sno, @Grade)
    else
    update Avgtable
    set avgGrade = (select AVG(Grade) from SC where Sno = @Sno)
    where Sno = @Sno
    fetch next from culInsert into @Sno, @Cno, @Grade
    end
    close culInsert
    deallocate culInsert
  • 相关阅读:
    Android内存分析和调优(中)
    Android内存分析和调优(上)
    背包九讲之四:混合背包问题:01,完全,多重的混合
    背包九讲之三:多重背包问题:一个物品允许选有限次
    背包九讲之二:完全背包问题:一个物品允许选多次
    背包九讲之一:01背包问题:一个物品只允许选一次
    动态规划:最长递增子序列
    动态规划:采油区域
    Hankson的趣味题
    动态规划:传纸条
  • 原文地址:https://www.cnblogs.com/yangfan-123/p/6805679.html
Copyright © 2011-2022 走看看