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;
posted @ 2020-01-11 09:29  程序杰杰  阅读(408)  评论(0编辑  收藏  举报