oracle insert 触发器无效_详解一个Oracle新特性--INSERT ALL/ANY,让你的sql更高效

概述

分享一个最近在给部门培训时用的一个新特性,INSERT ALL/ANY。这里先看一下下面这个场景。


需求

从一张表取数据插入到另一张表中,此外需要为插入的目标表做一个应用级的日志表,也就是说在插入目标表的同时,还需要将相同的数据插入到日志表中。

132b5bd4dc42ce30fff774a4a268b199.png

大家可以想一下,如果是你,会怎么去实现这个需求?


方案1:考虑触发器

cea9b4dfb5f57d6fd7067c3e15f1bad3.png

不过方案1存在以下几个问题:

⚫ CREATE TRIGGER

• 太“重”

• 实现与需求有差异

• 增加后续维护成本

• 触发器效率较低


方案2:考虑插入两次

6f65e19acd328d5007a2e7a900138d1a.png

这里方案2也存在几个问题:

3d3b26583e9144ccaf42a3ddfba18c30.png

事实上,以上这种写法是错误的,因为在两次insert的过程中,t表的数据有可能已经发生了变化,也就是说,t1,t2表得到的数据有可能不一样。


方案3:考虑游标

ea0ef7b224cefa35f92a64665ea8e9eb.png

方案3存在以下问题:

815ade1705273ff57167995f052a1098.png

方案4:考虑批量绑定

把T_ORG的数据批量绑定到v_id,v_name,然后用forall语法插入

9e3db435717e4016ceeb9dc3335ec1eb.png

方案4问题:这个方法就显得复杂很多了。

94da937ab93d9e54475853fa6553615f.png

最终方案

Oracle中的insert all是指把同一批数据插入到不同的表中,所以利用了Oracle这个新特性,实现逻辑也很清晰。

13be87d02696e1361e24b717f7ed98d8.png

总结

总之对于插入多张表或限定条件插入的优先选择insert all语法。

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

5dcfb0e5d86493a8d41ef2c5ca65302b.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值