美文网首页
09-19:存储过程

09-19:存储过程

作者: 神坛下的我 | 来源:发表于2018-09-19 16:44 被阅读0次

    触发器笔记(续)

    • 触发器是一类特殊的存储过程
    • DDL触发器(insert,delete,update)
    1. 后触发器 for,DDL触发器是建立在表上的,所有语法on table for insert,
      delete,update操作会相应激活触发器,同一个触发器针对多种动作都会触发,
      通过查询inserted和deleted幻表中是否存在数据来判断是哪种操作。
      针对dml操作产生数据变化,额外做记录,使用后触发器
    2. 替代触发器(前触发器)instead of
      将dml替代掉,针对dml操作产生数据变化,需要判断和验证通过才执行的使用
      替代触发器。
    create trigger trg_teacher_add
    on teacher 
    instead of insert 
    as 
    begin 
        declare @countno int 
        select @countno = count(*) from student 
        print convert(char(2),@countno)+'位教师'
        if @countno <= 11 
        begin
         insert into teacher select * from inserted
        end
        else
        begin
         print '无法添加新教师,已经满员'
        end
    end
    ... 
    
    • 新版的dml触发器是关闭秦涛,如一张表有替代插入触发器,数据通过验证,
      仍然需要将数据插入到本表中,如果打开了触发器嵌套,则形成 自己插入自
      己激活触发器又插入自己的死循环,解决方案为,插入表,触发器内部插入该
      表的视图,或者插入视图,触发器建立在视图上,在触发器中插入本表。

    • DCL触发器(create,drop,alter)
    1. 星期三不准删除表
    create trigger trg_drop_table
    on datebase 
    for drop_table
    as
    begin
     declare @day int
     select @day = datepart(dw,getdate())
     if(@day = 4) 
     begin
      raiserror('星期三不准删除表',16,20)
      rollback transaction
     end
    end
    
    • 查看表编号select object_id('student')

    存储过程

    • 是数据库预编译的对象,能够提高数据查询的效率。
    • 存储过程好处:
    1. 提高查询效率
    2. 减少网络传输
    3. 可以灵活的返回多种数据
    • 存储过程用于需要经过逻辑计算之后执行的dml,dql甚至ddl批量操作
    • 车次与票务表
    create table train
    (
     tid char(6) primary key,
     startCity varchar(20), 
     endCity varchar(20),
     begintime datetime,
     siteno  int,
     rowno int,
     coachno int
    )
    
    create table  ticket
    (
     tkno char(12) primary key,
     issell int
    )
    
    
    • 增加一个车次,填写了车次相关信息后,自动添加票务信息
    create procedure prc_addTrain @tid char(6),
                      @startCity varchar(20), 
                      @endCity varchar(20),
                      @begintime datetime,
                      @siteno  int, --每排的座位数
                      @rowno int, --每节车厢的排数
                      @coachno int, --车厢
                      @outno int output
    as
    begin
     insert into train values(@tid,@startCity,@endCity,@begintime,@siteno,@rowno,@coachno)
     declare @i int = 0,@j int = 0,@k int = 0,@coachnot char(2),
        @rownot char(2)
     while (@i < @coachno) --循环车厢
      begin
       set @i = @i + 1
       while(@j < @rowno) --循环每节车厢的行
        begin
         set @j = @j+1
         while(@k < @siteno) -- 循环每一行的座位
          begin
           set @k = @k+1
        if(@i < 10)
        begin
         set @coachnot = '0' + convert(char(2),@i)
        end
        else
        begin
         set @coachnot = convert(char(2),@i)
        end
    
        if(@j < 10)
        begin
         set @rownot = '0' + convert(char(2),@j)
        end
        else
        begin
         set @rownot = convert(char(2),@j)
        end
    
            -- print @coachnot+@rownot+
            -- convert(char(1),char(@k + 64))
        insert into ticket values(@tid+'-'+@coachnot+@rownot+
            convert(char(1),char(@k + 64)),0)
          end
          set @k = 0
        end
          set @j = 0
    
      end
      set @outno = @siteno * @rowno * @coachno
    end
    
    -- 输出参数使用:存储过程定义的时候,在输入参数之后,写输出参数
    带out关键值,并在存储过程中给out参数赋值,调用的时候声明相应变量
    来接收输出参数。
    declare @outno int
    exec prc_addTrain 'T05031','成都','广安','2011-12-23',5,10,2,@outno  output
    print '本次增加车票数量为'+convert(varchar(10),@outno)
    
    -- 得到字符的ASCII值:select ASCII('a')
    
    • 每位同学都要加分,1.60分以下加20%;2.60-80加18%但不超过90分;3.80分
      以上加15%但不超过100分,显示加分后的成绩

    相关文章

      网友评论

          本文标题:09-19:存储过程

          本文链接:https://www.haomeiwen.com/subject/yziinftx.html