概述

分享一个最近在给部门培训时用的一个新特性,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
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐