Oracle学习日记--Oracle中使用单个inert语句实现插入多行记录

目录

前言:

问题现象:

问题分析:

解决方法:

1、insert into ... union all句式

2、insert all into ...select 1 from dual句式

总结:


前言:

        最近项目中使用到了Oracle数据库,由于Oracle数据库我已经好几年没用过了,最近几年用的几乎都是MySQL数据库。

        在使用Oracle数据库编写SQL语句的过程中,发现了有一些函数、语法、句式是不太熟悉的,或者说是和MySQL有些区别的;因此最近我打算复习一下Oracle,同时在接下来的一段时间内也会不定期更新一些关于Oracle数据库的学习日记(文章),结合我个人的学习心得,也算是温故而知新吧,希望能帮助到有需要的同伴。


问题现象:

        今天在学习中遇到一个问题:

        如何在Oracle中,使用单个inert语句实现插入多行记录呢?


问题分析:

       由于最近几年都是使用MySQL数据库比较多,因此一开始遇到这个问题的时候,我其实是直接使用了MySQL中语法来解决这个问题的,下面将使用Oracle最经典的链接工具【PLSQL Developer】来进行测试,过程如下:

        先简单建表:

-- 建表语句
CREATE TABLE BIZ_BREED_INFO (breed_id INTEGER PRIMARY KEY,biz_breed VARCHAR2(255),memo VARCHAR2(255)
);COMMENT ON TABLE BIZ_BREED_INFO IS '业务品种表';
COMMENT ON COLUMN BIZ_BREED_INFO.breed_id IS '品种id';
COMMENT ON COLUMN BIZ_BREED_INFO.biz_breed IS '业务品种名称';
COMMENT ON COLUMN BIZ_BREED_INFO.memo IS '备注';

        然后使用一个insert语句插入多行记录:


INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES 
(1, '稻谷', '用于粮食生产和饲料'),
(2, '小麦', '用于面粉生产和饲料'),
(3, '玉米', '用于饲料、淀粉和乙醇生产'),
(4, '大豆', '用于食用油和蛋白质饲料'),
(5, '棉花', '用于纺织工业'),
(6, '花生', '用于食用油和蛋白质'),
(7, '马铃薯', '用于食品和工业淀粉'),
(8, '甘蔗', '用于制糖和乙醇生产'),
(9, '苹果', '用于鲜食和果汁'),
(10, '橙子', '用于鲜食和果汁'),
(11, '茶叶', '用于饮品和出口'),
(12, '蔬菜', '用于鲜食和加工'),
(13, '奶牛', '用于牛奶生产'),
(14, '猪', '用于肉类生产'),
(15, '鸡', '用于蛋和肉类生产'),
(16, '鱼类', '用于水产养殖'),
(17, '虾类', '用于水产养殖'),
(18, '蟹类', '用于水产养殖'),
(19, '蜂产品', '用于蜂蜜、蜂王浆等'),
(20, '烟草', '用于卷烟和其他烟草制品');

        没想到一执行就报错:

        查了一下发现,原来是Oracle不支持这样的写法。

        虽然我们都知道可以执行多个inert语句来实现多行数据记录的插入,如下:

INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (1, '稻谷', '用于粮食生产和饲料');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (2, '小麦', '用于面粉生产和饲料');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (3, '玉米', '用于饲料、淀粉和乙醇生产');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (4, '大豆', '用于食用油和蛋白质饲料');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (5, '棉花', '用于纺织工业');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (6, '花生', '用于食用油和蛋白质');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (7, '马铃薯', '用于食品和工业淀粉');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (8, '甘蔗', '用于制糖和乙醇生产');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (9, '苹果', '用于鲜食和果汁');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (10, '橙子', '用于鲜食和果汁');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (11, '茶叶', '用于饮品和出口');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (12, '蔬菜', '用于鲜食和加工');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (13, '奶牛', '用于牛奶生产');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (14, '猪', '用于肉类生产');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (15, '鸡', '用于蛋和肉类生产');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (16, '鱼类', '用于水产养殖');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (17, '虾类', '用于水产养殖');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (18, '蟹类', '用于水产养殖');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (19, '蜂产品', '用于蜂蜜、蜂王浆等');
INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (20, '烟草', '用于卷烟和其他烟草制品');

        但是,难道Oracle并不支持使用单个inert语句实现插入多行记录吗?

        抱着这样的疑问,我再次搜集了相关资料,才发现其实方法还是有的,只是sql写起来会显得很冗余。


解决方法:

1、insert into ... union all句式

        句式规则如下:

INSERT INTO 表名(字段列表) 
select 字段值列表 from dual 
union all
select 字段值列表 from dual 
union all

......

        SQL示例如下:

INSERT INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO)
SELECT 1, '稻谷', '用于粮食生产和饲料' FROM DUAL UNION ALL
SELECT 2, '小麦', '用于面粉生产和饲料' FROM DUAL UNION ALL
SELECT 3, '玉米', '用于饲料、淀粉和乙醇生产' FROM DUAL UNION ALL
SELECT 4, '大豆', '用于食用油和蛋白质饲料' FROM DUAL UNION ALL
SELECT 5, '棉花', '用于纺织工业' FROM DUAL UNION ALL
SELECT 6, '花生', '用于食用油和蛋白质' FROM DUAL UNION ALL
SELECT 7, '马铃薯', '用于食品和工业淀粉' FROM DUAL UNION ALL
SELECT 8, '甘蔗', '用于制糖和乙醇生产' FROM DUAL UNION ALL
SELECT 9, '苹果', '用于鲜食和果汁' FROM DUAL UNION ALL
SELECT 10, '橙子', '用于鲜食和果汁' FROM DUAL UNION ALL
SELECT 11, '茶叶', '用于饮品和出口' FROM DUAL UNION ALL
SELECT 12, '蔬菜', '用于鲜食和加工' FROM DUAL UNION ALL
SELECT 13, '奶牛', '用于牛奶生产' FROM DUAL UNION ALL
SELECT 14, '猪', '用于肉类生产' FROM DUAL UNION ALL
SELECT 15, '鸡', '用于蛋和肉类生产' FROM DUAL UNION ALL
SELECT 16, '鱼类', '用于水产养殖' FROM DUAL UNION ALL
SELECT 17, '虾类', '用于水产养殖' FROM DUAL UNION ALL
SELECT 18, '蟹类', '用于水产养殖' FROM DUAL UNION ALL
SELECT 19, '蜂产品', '用于蜂蜜、蜂王浆等' FROM DUAL UNION ALL
SELECT 20, '烟草', '用于卷烟和其他烟草制品' FROM DUAL;

        执行成功:

        执行成功后记得提交事务:

表数据如下:

2、insert all into ...select 1 from dual句式

            句式规则如下:

INSERT ALL
INTO 表名(字段列表) VALUES (字段值列表)
INTO 表名(字段列表) VALUES (字段值列表)
    ...
SELECT 1 FROM DUAL;

        由于在测试完第1种方法后,表中已经插入了20行数据,所以在测试第2种方法之前,需要先删除掉,执行删除sql:

        选择是,然后提交事务:

        再次查询表数据:

        然后使用第2种句式插入数据,SQL示例如下:


INSERT ALLINTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (1, '稻谷', '用于粮食生产和饲料')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (2, '小麦', '用于面粉生产和饲料')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (3, '玉米', '用于饲料、淀粉和乙醇生产')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (4, '大豆', '用于食用油和蛋白质饲料')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (5, '棉花', '用于纺织工业')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (6, '花生', '用于食用油和蛋白质')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (7, '马铃薯', '用于食品和工业淀粉')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (8, '甘蔗', '用于制糖和乙醇生产')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (9, '苹果', '用于鲜食和果汁')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (10, '橙子', '用于鲜食和果汁')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (11, '茶叶', '用于饮品和出口')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (12, '蔬菜', '用于鲜食和加工')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (13, '奶牛', '用于牛奶生产')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (14, '猪', '用于肉类生产')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (15, '鸡', '用于蛋和肉类生产')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (16, '鱼类', '用于水产养殖')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (17, '虾类', '用于水产养殖')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (18, '蟹类', '用于水产养殖')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (19, '蜂产品', '用于蜂蜜、蜂王浆等')INTO BIZ_BREED_INFO (BREED_ID, BIZ_BREED, MEMO) VALUES (20, '烟草', '用于卷烟和其他烟草制品')
SELECT 1 FROM DUAL;

        执行成功:

        提交事务:

        表数据如下:


总结:

        可以看到在Oracle中,确实是可以通过单个inert语句实现插入多行记录的!!!

        但是缺点也很明显,就是和MySQL的语句相比,SQL代码​​​很冗余。尤其是第2种句式,书写起来的代码,甚至比直接写20个insert语句还要多。当然第一种句式书写起来的代码和直接写20个insert语句其实也没差多少。

        相信大家都已经了解并学会了在Oracle中使用单个inert语句实现插入多行记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW 程序运行时内存不足报错原因

在 LabVIEW 程序开发与运行过程中,内存不足报错并退出是常见且棘手的问题。这不仅影响程序稳定性,还可能导致数据丢失与系统崩溃。以下从程序设计、硬件资源、系统环境等多维度深入剖析其成因,帮助开发者准确定位并解决问题。 ​ 一、程序设…

【GAN网络入门系列】一,手写字MINST图片生成

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 博主简介:努力学习的22级本科生一枚 🌟​;探索AI算法,C,go语言的世界;在迷茫中寻找光芒…

Baklib加速企业AI数据智理转型

Baklib智理AI数据资产 在AI技术深度渗透业务场景的背景下,Baklib通过构建企业级知识中台架构,重塑了数据资产的治理范式。该平台采用智能分类引擎与语义分析模型,将分散在邮件、文档、数据库中的非结构化数据转化为标准化的知识单元&#xf…

如何在Windows右键新建菜单中添加自定义项,将notepad添加到新建菜单

一、简介 Windows 右键新建菜单的核心管理机制隐藏在注册表的 HKEY_CLASSES_ROOT 根键中。这里存在两种关键注册表项:文件扩展名项和文件类型项,它们共同构成了新建菜单的完整控制体系。 以常见的.txt文件为例,系统通过以下机制实现新建菜单…

中大型水闸安全监测系统建设实施方案

一、方案背景 随着科技的不断进步,水利工程的数字化转型已经成为提升城市水资源管理效率和增强防洪能力的关键。今天,我们将引导您深入了解我国大中型水闸安全监测管理系统的构建方案,探讨如何运用先进技术确保国家水安全,提升水利…

Gartner《如何有效融合Data Fabric 与Data Mesh数据战略》学习心得

在当今数字化时代,数据已成为企业最为重要的战略资产之一。企业对于高效的数据管理架构的需求日益迫切,以确保能够从海量数据中提取有价值的信息,支持业务决策和创新。近年来,数据编织(Data Fabric)和数据网格(Data Mesh)成为了数据管理领域的两个热门概念,在行业内引…

matlab建立整车模型,求汽车的平顺性

在MATLAB中建立整车模型评估汽车平顺性,通常采用多自由度振动模型。以下是基于四分之一车模型的详细步骤和代码示例,可扩展至整车模型。 1. 四分之一车模型(简化版) 模型描述 自由度:2个(车身垂直位移 z2…

探究电阻分压的带负载能力

我们经常使用两个电阻去分压来获得特定的电压,那么我是两个大阻值电阻分压获得的电压驱动能力强,还是小阻值电阻分压得到的电压驱动能力强呢? 一、电压相同时,电流的大小 下面是两个阻值分压得到的仿真图 电路分析: VCC都是5V,探针1和探针2测到的电压都是1.67V; 根据…

牛客网NC22222:超半的数

牛客网NC22222:超半的数 题目描述 输入输出格式 输入格式: 第一行包含一个整数 n (1 ≤ n ≤ 1000)第二行包含 n 个整数 a_i (1 ≤ a_i ≤ 10^9) 输出格式: 输出一个整数,表示出现次数超过一半的那个数 解题思路 这道题目有多种解法&a…

开发日常中的抓包工具经验谈:Charles 抓包工具与其它选项对比

开发日常中的抓包工具经验谈:HTTPS调试怎么选? 在移动开发或Web API联调时,网络请求常常成为问题定位的第一难题。尤其是面对加密的 HTTPS 请求,传统浏览器调试工具已显得力不从心。 我们团队最近在排查一个安卓应用中的支付延迟…

哈希表实现(1):

1. 哈希: 之前我们的红黑数的查找是由于左边小右边大的原则可以快速的查找,我们这里的哈希表呢? 这里是用过哈希函数把关键字key和存储位置建立一个关联的映射。 直接定址法(函数函数定义的其中一种): 直…

泰迪杯特等奖案例深度解析:基于多级二值化与CNN回归的车牌识别系统设计

(第八届泰迪杯数据挖掘挑战赛特等奖案例全流程拆解) 一、案例背景与核心挑战 1.1 行业痛点与场景需求 在智慧交通与无感支付场景中,车牌识别是核心环节。传统车牌识别系统在复杂光照、污损车牌、多角度倾斜等场景下存在显著缺陷。根据某智慧油站2024年运营数据显示,高峰期…

光学变焦和数字变倍模块不同点概述!

一、光学变焦与数字变倍模块的不同点 1. 物理基础 光学变焦:通过调整镜头组中镜片的物理位置改变焦距,实现无损放大。例如,上海墨扬的MF-STAR吊舱采用30倍光学变焦镜头,焦距范围6~180mm,等效焦距可达997mm。 数字…

ECMAScript标准:JavaScript的核心

什么是ECMAScript? ECMAScript(简称ES)是一个由ECMA国际(欧洲计算机制造商协会)制定的脚本语言标准,它为JavaScript、JScript和ActionScript等脚本语言提供了基础规范。JavaScript 可以视为 ECMAScript 的…

小白学AI DeepSeep 部署中的常见问题及解决方法

在部署 DeepSeek(或类似的大模型/AI 系统)时,可能会遇到多种技术或环境相关的问题。以下是常见问题及对应的解决方案,结合实际部署经验总结: 文章目录 前言一、 硬件资源不足二、环境配置问题三、模型加载或推理失败四、网络或分布式训练问题五、数据加载或预处理问题六、…

redis数据结构-11(了解 Redis 持久性选项:RDB 和 AOF)

了解 Redis 持久性选项:RDB 和 AOF Redis 提供了多个持久性选项,以确保数据持久性并防止在服务器发生故障或重启时丢失数据。了解这些选项对于为您的特定使用案例选择正确的策略、平衡性能和数据安全至关重要。本章节将深入探讨 Redis 中的两种主要持久…

LLaMA-Factory:环境准备

一、硬件和系统 操作系统: Ubuntu 24.04.2 LTS(64位)GPU: NVIDIA RTX 4090 笔记本 GPU,16GB显存CPU: 建议高性能多核 CPU(如 Intel i7/i9 或 AMD Ryzen 7/9)以支持数据预处理,我的是32核。RAM: 至少 32GB&…

2025 uniapp的请求封装工具类以及使用【拿来就用】

一、创建一个http请求封装的js文件,名字自定义:my_http.js /*** 基础API请求地址(常量,全大写命名规范)* type {string}* constant*/ let BASE_URL //通过环境来判断基础路径 if (process.env.NODE_ENV development…

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值 在桌面软件开发领域,应用程序的启动过程就像音乐的序曲,决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时,会让大多数用户产生负面看法,而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发的利器,其启动过程的优化不仅关乎用户体验…

Node.js入门指南:开启JavaScript全栈开发之旅

Hi,我是布兰妮甜 !Node.js让JavaScript突破了浏览器的限制,成为全栈开发的利器。作为基于V8引擎的高性能运行时,它彻底改变了JavaScript只能做前端开发的局面。本文将带你快速掌握Node.js的核心用法:环境搭建与模块系统…