Oracle批量新增数据最佳实践
一、需求描述
现在的项目改造过程中,从国产的Gbase数据库改造为Oracle数据库,遇到一个问题有的业务操作需要批量新增数据。
这也是一个比较常规的操作,有很多地方确实需要一次性新增多条数据。Gbase数据库的语法和Mysql的语法大同小异,
INSERT INTO 表 (字段一,字段二,字段三) VALUES (值一,值二,值三), (值一一,值二二,值三三);可是Oracle中
可没有批量新增的语法,这怎么办呢?
二、需求分析
通过百度查找答案,找到一篇比较好的文章,https://www.cnblogs.com/azhqiang/p/8136151.html
大致意思是需要使用查询Oracle中的虚表DUAL,还有使用关键字 UNION 或者是 UNION ALL来实现。
实现的语法为 INSERT INTO 表 (字段一,字段二,字段三) SELECT 值一,值二,值三 FROM DUAL
UNION(或者) UNION ALL
SELECT 值一一,值二二,值三三 FROM DUAL;
UNION(或者) UNION ALL
SELECT 值一一一,值二二二,值三三三 FROM DUAL;
三、解决方案
找到解决方法方法后立马进行尝试,修改的代码如下,
测试结果一,新增两条数据,结果正确。
测试结果二,新增一条数据,测试通过。
可是把新增一条数据的SQL拷贝一份到PLSQL中执行,却不能正确执行,报一个错:未明确定义的列。
自己经过反复排查,也和同事进行讨论,最终确定这种批量插入方式存在问题,然后进行改进。
改进后去除了外层的SELECT A.*,然后再次尝试,插入一条数据或者是多条数据都能够正常插入,功能改造完成。
至于使用UNION 还是 UNION ALL,影响都不大,改造的系统中数据量比较适中,不是太大。