zoukankan      html  css  js  c++  java
  • oracle触发器简单实用示例

    分为行级与语句级;行级就是每受影响的一行就触发改行一次,语句级就是触发一次语句执行一次,不论该语句影响了几行

     --20200429加入  begin

    删除、更新都有:old与:new,插入只有:new

    如果操作表的时候,在一个语句块内,触发器执行异常,则该语句块将全部回滚,如:

    --触发器
    create or replace trigger trigger2 
    before insert on aaa 
    FOR EACH ROW 
    begin
      --dbms_output.put_line(:new.column1);
      delete aaa where id=:new.column1;
    end;
    begin
      insert into aaa values('5','5');
      insert into aaa values('6','1'); --因为有外键这条删不掉
    end;

    结果是aaa表无任何变化,验证成功!

    --end

    最基础的就是:new与:old

    这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在(这个就是行级)

    理解一下就能够知道的是 update都存在;insert只存在:new;delete只存在:old

    AFTER与BEFOR 

    这个理解一下就能知道BEFOR 就是数据库本身事务提交之前触发;AFTER就是执行完本身事务之后触发;(这里提到了事务,后面会提到为什么会提及事务)

    另外需要说的是,通过update语句更新行,即使改行没变化,但是执行语句了,也是会触发update影响行数的,因此下方代码考虑到了这一点

    (下方示例是如果状态发生了变更,并且名字包含'OP',那么我执行数据库的操作)

    create or replace TRIGGER EQUIP_STATE2MES 
    AFTER UPDATE OF EQUIP_STATE ON P_EQUIP_WORK_STATE 
    FOR EACH ROW 
    BEGIN
    if(:old.EQUIP_STATE!=:new.EQUIP_STATE) then
      if(:old.EQUIP_NAME like '%OP%')
      then insert into EQUIP_ALARM_MES (EQUIP_ALARM_MES_ID,EQUIP_CODE,ALARM_CODE,ALARM_DESCRIPTION,ALARM_START_TIME,REMARK) 
                                  values(SYS_GUID(),:old.EQUIP_CODE,:old.EQUIP_NAME,:new.EQUIP_STATE,sysdate,'1');
      end if;
       end if;
    END;

    对于上方提到的事务,下面就需要了(我想要声明变量,去判别满足条件的数量,如果满足我再执行对同一张表的操作)(如果(操作)插入的时候使用:new :old这样不需要判别内外事务了)

    (但是如果按照正常写法而不使用:new:old关键字的话,更新和插入同一张表默认为同一个事务,这样我个人理解为事务互相等待,这样提交不了,需要显示自定义事务来解决)

    (不要考虑上方的了,就是当对同一张表进行操作,在触发器中的操作我们使用自定义的事务,并且显示提交它,就可以!!!不同的表,当然如上方的代码,里面使用:new :old即可)

    (总之能使用:new :old就是用这个就好,这样肯定没问题)

    (pragma autonomous_transaction;  )

    create or replace TRIGGER NXJCESHI 
    AFTER UPDATE OF COL1 ON ZZZNEW 
    FOR EACH ROW 
    declare  sourceUserTpCount number:=0;
    pragma autonomous_transaction;   
    BEGIN
        select count(*) into sourceUserTpCount from ZZZNEW WHERE :new.COL1 IN (select TRANSFER_NUMBER FROM ZZZ);--:new.COL1这样执行才会完成功能,否则直接写COL1,它会默认为前一次的
        if(sourceUserTpCount>0) then
          insert into ZZZNEW (KEY) values (sys_guid());
          commit;   --必须显示提交事务
        end if;
    END;
  • 相关阅读:
    JSP注册登录页教程
    SSH框架搭建详细图文教程
    .Net Core2.2升级到3.1小记
    AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
    AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
    AspNetCore容器化(Docker)部署(二) —— 多容器通信
    AspNetCore容器化(Docker)部署(一) —— 入门
    asp.net core 3.0 gRPC框架小试
    HttpClient Received an unexpected EOF or 0 bytes from the transport stream
    PdfReader按页将PDF切割成多个PDF
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/12179010.html
Copyright © 2011-2022 走看看