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,影响都不大,改造的系统中数据量比较适中,不是太大。

posted @   一只爱阅读的程序员  阅读(1917)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示