当前位置:   article > 正文

oracle触发器的自治事务_oracle触发器写法insert

oracle触发器写法insert

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的数据没有插入,数据库排名数据却发生了变化。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/509214
推荐阅读
相关标签
  

闽ICP备14008679号