zoukankan      html  css  js  c++  java
  • SQL 存储过程 触发器 事务

    一、存储过程

    存储过程:就像函数一样的
    会保存在:数据库中--》可编程性 --》 存储过程

    创建存储过程:
    create proc JiaFa --存储关键字proc

    @a int,               --需要的参数
    @b int

    as
                             --存储过程的内容
    declare @c int;
    set @c = @a + @b;
    return @c;
    go                     --执行完毕后全部选中,执行创建



    执行存储过程:关键字exec
    exec JiaFa 3,5;              --无返回值时

    declare @f int;               --有返回值时
    exec @f = JiaFa 3,5;       --存储名后面填参数
    print @f;

    例:根据用户传入的参数查询汽车表符合该条件的汽车数量
    create proc ChaXun       --创建存储过程
    @n varchar(20)
    as
    declare @num int
    select @num = count(*) from car where name like '%'+@n+'%'
    return @num
    go

    declare @m int              --执行存储过程
    exec @m = ChaXun '奥迪'
    print @m

    二、触发器

    是一个特殊的存储过程    通过增删改的动作来触发执行,没有参数,没有返回值

    满足条件时执行,否则不执行

    create trigger Insert _Student            --命名规范  关键字:tigger  注意下划线

                         Insert/delete/update_表名   在[表名]表 添加/删除/修改 数据是执行

    on student                                        --针对于哪一个表    on

    for /instead of   insert                      --针对于哪一个动作来触发   for     同js: onclick = "show()"

    as

          触发执行的代码段 触发过程
    go

    ※ for的意思是在动作执行之后触发

    ※ instead of delete 的意思是删除之前引发,可以理解为替代,写了这个之后,写的执行代码就没有用了,就被触发器的代码覆盖了

    例:

    create trigger Delete_Info

    on info
    instead of delete
    as
    declare @c varchar(20)
    select @c = code from deleted

    delete from work where infocode=@c
    delete from family where infocode=@c
    delete from info where code=@c
    go

    触发器常用的为级联删除

    例:
    create trigger delete_student
    on student
    instead of delete
    as
    --如果要删除student表数据,那么需要级联删除
    declare @sno varchar(20);
    set @sno = sno from deleted      --deleted固定格式,为删除执行所能删除的数据,并没有执行删除,而是把他们显示出来,在这获得要删除的数据的sno,

                       然后先删除其他表中此sno的数据
    delete from score where sno = @sno;
    delete from student where sno = @sno;
    go

     三、事务

    保障流程的完整执行 (两条多条sql语句要么同时成功,要么同时失败)

    例:就像银行取钱,先在你账上扣钱,然后存入别人的账上,但是从你账上扣完钱了,突然网断了,对方没有收到钱,那么此时你的钱也没了,别人的钱也没加上,为了防止此类情况的出现,事务。

    begin tran               --在流程开始的位置

      sql语句

    if @@ERROR>0           --判断是否有错误
    begin
      rollback tran          --回滚事务,到begin tran的位置,就当没发生过
    end
    else
    begin
      commit tran           --提交事务,都没问题,那么就一把进行提交
    end

    例:购物车实例

    begin tran                                       --开启事务
    declare @tran_error int;                   --存储错误
    set @tran_error = 0;                       --默认没有错误

    update Fruit set Numbers = Numbers-1 where Ids='k002'
    set @tran_error = @tran_error + @@ERROR;
    update Login set Account=Account-1 where UserName='wangwu'
    set @tran_error = @tran_error + @@ERROR;
    insert into Orders values('d002','wangwu','2016-8-7')
    set @tran_error = @tran_error + @@ERROR;
    insert into OrderDetails values('d002','k002',10)
    set @tran_error = @tran_error + @@ERROR;


    if @tran_error>0
    begin
    rollback tran                                   --回滚事务,到begin tran的位置,就当没发生过
    end
    else
    begin
    commit tran                                   --提交事务,都没问题,那么就一把进行提交
    end

  • 相关阅读:
    美团大数据质量监控平台
    大数据理论体系总结--数据仓库管理与全链路数据体系
    spark图解
    forEach、map、filter、find、sort、some等易错点整理
    轮播图(jQuery)
    js 数组、对象转json 以及 json转 数组、对象
    jquery 获取元素(父节点,子节点,兄弟节点),元素筛选
    前端面试总结 (转 0C°)
    Git入门看这一篇就够了! (转)
    Rotating Scoreboard POJ
  • 原文地址:https://www.cnblogs.com/ShenG1/p/5763284.html
Copyright © 2011-2022 走看看