首页 > 数据库技术 > 详细

oracle触发器简单实用示例

时间:2020-01-11 11:06:56      阅读:82      评论:0      收藏:0      [点我收藏+]

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

 

最基础的就是: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;

oracle触发器简单实用示例

原文:https://www.cnblogs.com/ningxinjie/p/12179010.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!