Oracle insert all 详解

Oracle insert all 详解文章目录1概述2insert的两种形式2.1insertfirst2.2insertall3数据一致性(同时插入)2.1验证:insertinto数据不一致2.2验证:insertall数据一致1概述1.作用:’正确、高效’的将’同一批数据’插入至’不同的表’中2.好处(1)’正确’:避免数据差异(2)’高效’:优于写多个insertinto(因为无论插入多少张表,’主表’只会被读取一次)3.场景,若需求:将表t中

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1 概述

1. 作用:'正确、高效' 的将 '同一批数据' 插入至 '不同的表'2. 好处
   (1) '正确':避免数据差异
   (2) '高效':优于写多个 insert into(因为无论插入多少张表,'主表' 只会被读取一次)
   
3. 场景,若需求:将表 t 中的数据 '同时插入' 至表 t1、t2
   若不知晓 insert all 语句,咱可能会使用 insert into 两次
   insert into t1 select * from t;
   insert into t2 select * from t;

   问题:在两次 insert 过程中,有可能 t 表的数据发生了改变,
   从而导致 t1、t2 '得到的数据不一致'。
   
   解决办法:insert all

2 insert 的两种形式

1. insert first: 仅对 '第一个' 匹配成功项进行插入
2. insert all  : 对 '每个' 匹配成功项都进行插入

基础数据准备:

create table stu_info (
   sno   number(3),
   sname varchar2(30),
   sex   varchar2(2)
);

insert into stu_info(sno, sname, sex) values(1, '瑶瑶', '女');
insert into stu_info(sno, sname, sex) values(2, '优优', '男');
insert into stu_info(sno, sname, sex) values(3, '倩倩', '女');
commit;

-- 两张测试表
create table stu_info_1 as select * from stu_info where 1 = 2;
create table stu_info_2 as select * from stu_info where 1 = 2;

2.1 insert first

-- 仅对 '第一个' 匹配成功项进行插入
insert first
  when sno >= 2 then -- 不能用别名哦,如:t.sno
    into stu_info_1(sno, sname, sex)
  when sno >= 3 then
    into stu_info_2(sno, sname, sex) 
select t.sno, t.sname, t.sex from stu_info t;

查询结果:

select * from stu_info;
select * from stu_info_1;
select * from stu_info_2;

图示:仅对 ‘第一个’ 匹配成功项进行插入
在这里插入图片描述

2.2 insert all

-- 对 '每个' 匹配成功项都进行插入
insert all
  when sno >= 2 then -- 不能写别名哦,如:t.sno
    into stu_info_1(sno, sname, sex)
  when sno >= 3 then
    into stu_info_2(sno, sname, sex) 
select t.sno, t.sname, t.sex from stu_info t;

查询结果:对 ‘每个’ 匹配成功项都进行插入
在这里插入图片描述

3 数据一致性(同时插入)

3.1 验证:insert into 数据不一致

1. 模拟:将表 stu_info 中的数据同时插入 stu_info_1 和 stu_info_2

2. 分三个窗口模拟 '同时插入(并行)'
   (1) 窗口1: 将 stu_info 数据插入 stu_info_1(模拟时长 30 s)
   (2) 窗口2: 将 stu_info 数据插入 stu_info_2(模拟时长 30 s)
   (3) 窗口3:此时更新 stu_info 记录,使之影响 tu_info_1 和 stu_info_2(上述模拟时长内) 

3. 清空表 stu_info_1、stu_info_2 -- 若有数据
   truncate table stu_info_1;
   truncate table stu_info_2;

4. dbms_lock 包权限 -- 若无权限,sys 用户授权
   -- conn system/system@orcl as sysdba
   grant execute on sys.dbms_lock to scott;

图示:
在这里插入图片描述

窗口1:插入 stu_info_1,更新 sno = 2 的记录时,等待(模拟执行时长)

declare
begin
  for i in 1 .. 3 loop
  
    if i = 2 then
      dbms_lock.sleep(30); -- 模拟执行时长:30 秒
    end if;
  
    insert into stu_info_1
      (sno, sname, sex)
      select t.sno, t.sname, t.sex from stu_info t where t.sno = i;
    commit;
  
  end loop;
end;

窗口2:插入 stu_info_1,更新 sno = 3 的记录时,等待(模拟执行时长)

declare
begin
  for i in 1 .. 3 loop
  
    if i = 3 then
      dbms_lock.sleep(30); -- 模拟执行时长:30 秒
    end if;
  
    insert into stu_info_2
      (sno, sname, sex)
      select t.sno, t.sname, t.sex from stu_info t where t.sno = i;
    commit;
  
  end loop;
end;

窗口3:更新 stu_info 记录,使之影响 tu_info_1 和 stu_info_2(上述模拟时长内)

update stu_info t set t.sname = 'update_2', t.sex = '22' where t.sno = 2;
commit;

测试结果:stu_info_1 和 stu_info_2 两者记录不一致!
在这里插入图片描述

3.2 验证:insert all 数据一致

1. 同理,可分为 两个窗口测试

2. 清空表 stu_info_1、stu_info_2,并还原 stu_info 的数据

窗口1:插入数据至 stu_info_1 和 stu_info_1

declare
begin
   for i in 1 .. 3 loop
   
      if i = 2 then
         dbms_lock.sleep(30); -- 模拟执行时长:30 秒
      end if;
   
      insert all 
         into stu_info_1(sno, sname, sex) 
         into stu_info_2(sno, sname, sex)
      select t.sno, t.sname, t.sex from stu_info t where t.sno = i; 
      commit;
   
   end loop;
end;

窗口2:更新 stu_info 记录,使之影响 tu_info_1 和 stu_info_2(上述模拟时长内)

update stu_info t set t.sname = 'update_3', t.sex = '33' where t.sno = 3;
commit;

测试结果:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160934.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 这个夏天不AC(杭州电2037)

    这个夏天不AC(杭州电2037)

  • 【C语言】getchar 函数的正确使用

    【C语言】getchar 函数的正确使用目录一、getchar函数二、缓冲区1、什么是缓冲区2、为什么要存在缓冲区3、缓冲区的类型4、缓冲区的刷新三、getchar函数的正确使用1、getchar的换行问题2、getchar与scanf的混合使用一、getchar函数从上面的介绍来看,我们要正确使用getchar函数,首先得了解什么是缓冲区。二、缓冲区1、什么是缓冲区缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

    2022年10月19日
  • Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)

    Oracle连接查询,彻底搞懂外连接(左外连接&右外连接)Oracle连接查询有3种:交叉连接、内连接、外连接。交叉连接结果是其他连接结果的超集,外连接结果是内连接结果的超集。接下的例子以departments_v、employees_v两个视图数据为例(4条部门数据,9条人员数据)1.交叉连接:又称笛卡尔积连接,是两个或多个表间的无条件连接,因此它会将表1的每一条数据与表2的每一条数据连接,因此结果会有4*9=36条数据

  • 图像处理—-lena图像的由来「建议收藏」

    图像处理—-lena图像的由来「建议收藏」作者: 邓亮来源http://kexuesongshuhui.blog.163.com/blog/static/935965672009626101158405/?163toutiao 她是让无数专家为之痴迷和痛苦的研究对象,她是充斥着枯燥数学公式的论文中最吸引眼球的光芒,翻开任何一本关于计算机图像处理的教材,你都能看到她动人的微笑。她就是雷娜(Lena),她的照片是图像处理领域使用最

  • no rule to process file “xxxxxxxxx” of type XXXXXX.h for architecture i386解决办法

    no rule to process file “xxxxxxxxx” of type XXXXXX.h for architecture i386解决办法1.每次遇到黄色警告就头疼,一方面log一大堆,不想看.二来解决麻烦.2直接说解决办法TARGET→BuildPhases→ Compile Source→删除报错的xxxxx.h文件→clean工程→编译(OK,解决),你要没解决我也没办法

  • 【Unity3D入门教程】Unity3D之GUI浅析「建议收藏」

    【Unity3D入门教程】Unity3D之GUI浅析「建议收藏」一款典型的软件都会有交互界面,这些界面包括标签、按钮、拖动条等。Unity3D内置一些基本的GUI命令,可以在屏幕上绘制简单的交互控件。本文主要介绍传统的GUI。而最新加入的UGUI模块将在下一讲中介绍。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号