• oracle触发器的自治事务


    1、插入数据,名次依次+1

    今天有朋友提问说 ,oracle数据库怎么实现这个功能:

            有一个排名表,插入一条数据排名为1的数据,之前表里数据1变成2,2,变成3类推、插入2,之前表里2变3,3变4类推,首先想到了触发器,在插入数据之前把排名大于等于当前的名次依次+1来实现。

    比如表数据如下,rank字段代表名次

     编写触发器如下:

    1. create or replace trigger TRI_add
    2. before insert on b
    3. for each row
    4. declare
    5. begin
    6. update b set b.RANk=b.RANk+1 where b.RANk>:new.RANk or b.RANk=:new.RANk ;
    7. end TRI_add;

    触发器创建好之后,插入一条数据测试一下:

    insert into b (ID,  RANk) values (3, 1);

    插入数据后结果如下:

     可以看到插入第一名之后,原来id为1的第一名rank标称了2,原来id为2的第二名rank变成了3,基本需求也算是满足了。

    2、触发器自治事务,数据回滚,则触发器不回滚实现

    朋友又问我说,你这个插入数据的时候回滚掉,那么原来排名的名次不会换掉,我现在如果插入数据再回滚,然后之前的排名任然+1这个怎么实现呢。

    这个时候我们就可以使用自治事务,在触发器触发期间提交掉事务,不管插入数据的事务是否成功,因此在以上触发器上修改如下:

    1. create or replace trigger TRI_add
    2. before insert on b
    3. for each row
    4. declare
    5. PRAGMA autonomous_transaction;
    6. begin
    7. update b set b.RANk=b.RANk+1 where b.RANk>:new.RANk or b.RANk=:new.RANk ;
    8. commit;
    9. end TRI_add;

    实际上就是增加了这两行

     

     这个时候恢复数据,然后再执行插入数据,之后回滚再看结果

    insert into b (ID,  RANk) values (3, 1);

    可以观察到id为3的数据没有插入,数据库排名数据却发生了变化。 

  • 相关阅读:
    两行CSS让页面提升了近7倍渲染性能!
    Linux设置网络代理
    flask请求生命周期
    D. Epic Transformation
    OpenFeign
    【异常、线程】全网最详细解读
    C++ 内存管理 基本部分
    uniapp 单位rpx ,设计稿尺寸px处理方式
    rollup的使用
    电容笔有什么用?电容笔十大品牌排行
  • 原文地址:https://blog.csdn.net/jungeCSND/article/details/126050198