概述
分享一个最近在给部门培训时用的一个新特性,INSERT ALL/ANY。这里先看一下下面这个场景。
需求
从一张表取数据插入到另一张表中,此外需要为插入的目标表做一个应用级的日志表,也就是说在插入目标表的同时,还需要将相同的数据插入到日志表中。
大家可以想一下,如果是你,会怎么去实现这个需求?
方案1:考虑触发器
不过方案1存在以下几个问题:
⚫ CREATE TRIGGER
• 太“重”
• 实现与需求有差异
• 增加后续维护成本
• 触发器效率较低
方案2:考虑插入两次
这里方案2也存在几个问题:
事实上,以上这种写法是错误的,因为在两次insert的过程中,t表的数据有可能已经发生了变化,也就是说,t1,t2表得到的数据有可能不一样。
方案3:考虑游标
方案3存在以下问题:
方案4:考虑批量绑定
把T_ORG的数据批量绑定到v_id,v_name,然后用forall语法插入
方案4问题:这个方法就显得复杂很多了。
最终方案
Oracle中的insert all是指把同一批数据插入到不同的表中,所以利用了Oracle这个新特性,实现逻辑也很清晰。
总结
总之对于插入多张表或限定条件插入的优先选择insert all语法。
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~