【笔记】Oracle触发器,根据另外一张表是否存在此记录,来判断是否更新

【笔记】Oracle触发器,根据另外一张表是否存在此记录,来判断是否更新多读书多看报少吃零食多睡觉

需求说明:

        平时接触的触发器都是在一张表内,根据某个字段来判断是否更新,今天的需求是:更新【本硕博表】的yxmc、ymdm字段时,需要触发器来同步更新【基本表】中的yxmc、yxdm字段。

        按说这个放平时就直接在后端代码中直接解决就完事了,但是硬性要求使用Oracle的触发器,于是有了这篇笔记。

代码:

create or replace trigger tr_ss_test after update on XYDB_QRZSS for each row --声明一个变量 用来接住查询是否存在的条数 declare cnt number; begin if :new.YXMC <> :old.YXMC or :new.YXDM <> :old.YXDM then --找出本科表里是否存在这条uuid的记录 如果没有则进行update 此为优化的sql,目的是节省查询资源 select count(*) into cnt from dual where exists(select bk.uuid from xydb_qrzbk bk where bk.uuid = :new.uuid); if cnt=0 then update xydb_base b set b.yyxmc = b.xyxmc, b.yyxdm = b.xyxdm, b.xyxmc = :new.yxmc, b.xyxdm = :new.yxdm where b.uuid = :new.uuid; dbms_output.put_line('硕士为初始学历,更新成功!'); else dbms_output.put_line('硕士不为初始学历,不进行更新!'); end if; end if; end; 

sql代码如上,本科和博士的sql也大同小异,里边的核心是查询另外一张表是否有这条数据。

更新:将原来只有update才会触发优化为增删改都会触发,代码如下

create or replace trigger tr_ss_test after insert or update or delete on XYDB_QRZSS for each row declare cnt number; bscnt number; begin case when inserting then dbms_output.put_line('开始插入!'); --找出本科表里是否存在这条uuid的记录 如果没有则进行update select count(*) into cnt from dual where exists(select bk.uuid from xydb_qrzbk bk where bk.uuid = :new.uuid); if cnt=0 then update xydb_base b set b.yyxmc = b.xyxmc, b.yyxdm = b.xyxdm, b.xyxmc = :new.xyxmc, b.xyxdm = :new.xyxdm where b.uuid = :new.uuid; dbms_output.put_line('硕士为初始学历,更新成功!'); else dbms_output.put_line('硕士不为初始学历,不进行更新!'); end if; when updating then dbms_output.put_line('开始更新!'); if :new.xyxmc <> :old.xyxmc or :new.xyxdm <> :old.xyxdm then --找出本科表里是否存在这条uuid的记录 如果没有则进行update select count(*) into cnt from dual where exists(select bk.uuid from xydb_qrzbk bk where bk.uuid = :new.uuid); if cnt=0 then update xydb_base b set b.yyxmc = b.xyxmc, b.yyxdm = b.xyxdm, b.xyxmc = :new.xyxmc, b.xyxdm = :new.xyxdm where b.uuid = :new.uuid; dbms_output.put_line('硕士为初始学历,更新成功!'); else dbms_output.put_line('硕士不为初始学历,不进行更新!'); end if; end if; when deleting then dbms_output.put_line('开始删除!'); --找出本科表里是否存在这条uuid的记录 如果没有则进行update select count(*) into cnt from dual where exists(select bk.uuid from xydb_qrzbk bk where bk.uuid = :old.uuid); --硕士学历删除 本科学历为空 再判断博士表是否有记录 if cnt=0 then --找出博士表里是否存在这条uuid的记录 如果没有则进行update select count(*) into bscnt from dual where exists(select bs.uuid from xydb_qrzbs bs where bs.uuid = :old.uuid); --博士表有记录 本硕都无记录 即轮到博士表作为初始学历 if bscnt=1 then update xydb_base b set b.yyxmc = b.xyxmc, b.yyxdm = b.xyxdm, b.xyxmc = (select bs.xyxmc from xydb_qrzbs bs where bs.uuid = :old.uuid), b.xyxdm = (select bs.xyxdm from xydb_qrzbs bs where bs.uuid = :old.uuid) where b.uuid = :old.uuid; dbms_output.put_line('本硕不为初始学历,将博士学历更新为初始学历!'); else --本硕博都为空 则更新为null update xydb_base b set b.yyxmc = b.xyxmc, b.yyxdm = b.xyxdm, b.xyxmc = null, b.xyxdm = null where b.uuid = :old.uuid; dbms_output.put_line('本硕博都不为初始学历,将初始学历更新为null!'); end if; end if; else dbms_output.put_line('无操作!'); end case; end;

总结:

多读书多看报少吃零食多睡觉

参考:

触发器详解: http://t.csdn.cn/jEwQz    

判断是否存在:http://t.csdn.cn/SPDa2

今天的文章 【笔记】Oracle触发器,根据另外一张表是否存在此记录,来判断是否更新分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-14 11:27
下一篇 2024-12-14 11:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/86267.html