练习 DOUBLE INSERT

目标:从一张表取数据插入到另一张表中,此外需要为插入的目标表做一个应用级的日志表,也就是说在插入目标表的同时,还需要将相同的数据插入到日志表中。

在案例一中,我们给出了CREATE TRIGGER;OPEN CURSOR ;BULK INTO VARIABLE; DOUBLE INSERT; INSERT ALL 等方案。每个方案中也阐述了他的优缺点。

其中在DOUBLE INSERT,为了保证数据的一致性,又给出了四种思路,它们分别是锁,串行,临时表和as of 查询。下面将展现这四种思路SQL的展现。

当然DOUBLE INSERT 除了一致性的问题,还有原子性的问题,即有可有目标表和 日志表只成功了其它一个,或都没成功。关于原子性的问题。暂不讨论。

1.1思路一 锁

Drop table test;

Drop table T_ORG;

DROP TABLE T_LOG;

create table test as select * from all_objects ;

create table T_ORG as select * from all_objects  WHERE 1=2;

create table T_LOG as select * from all_objects WHERE 1=2;

#   --共享行专用(SRX):阻止其他事务操作,其会会话不能对test表进行DML操作

SQL> lock table t in exclusive mode nowait;

Locked Object:

OWNEROS_USER_NAME  OBJECT_NAME   SIDSERIAL# LOCKED_MODE LOGON_TIM

------- ------------- ----------------- ---------- ----------- -------

SYS     oracle        TEST       18         17           6 26-APR-19

SYS@test>INSERT INTO T_ORG SELECT * FROM TEST;

72183 rows created.

SYS@test>INSERT INTO T_LOG SELECT * FROM TEST;

72183 rows created.

新开一个窗口执行delete 操作产生等待:

SYS@test2>delete from test where OBJECT_ID <10 ;

直到原来窗口事务结束。

SYS@test>COMMIT ;

问题:影响其它事务

1.2思路二 串行事务面临的问题 ora-01555

Drop table test;

Drop table T_ORG;

DROP TABLE T_LOG;

create table test as select * from all_objects ;

create table T_ORG as select * from all_objects  WHERE 1=2;

create table T_LOG as select * from all_objects WHERE 1=2;

SYS@test>create undo tablespace undotbs datafile '/u01/app/oracle/oradata/test/undotbs.dbf' size 1M ;

Tablespace created.

SYS@test>alter system set undo_tablespace=undotbs;

SYS@test>show parameter undo ;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ---------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS

declare

begin

INSERT INTO T_ORG SELECT * FROM TEST;

INSERT INTO T_LOG SELECT * FROM TEST;

Commit ;

end ;

/

*

ERROR at line 1:

ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS'

ORA-06512: at line 3

SYS@test>select count(*) from T_ORG ;

COUNT(*)

----------

0

问题:UNDO 空间不足时,会报ORA-30036
     如果UNDO空间被覆盖会报ORA-01555

1.3思路三 临时表

Drop table test;

Drop table T_ORG;

DROP TABLE T_LOG;

create table test as select * from all_objects ;

create table T_ORG as select * from all_objects  WHERE 1=2;

create table T_LOG as select * from all_objects WHERE 1=2;

SYS@test>alter system set undo_tablespace=UNDOTBS1;

创建会话级别临时表:

SYS@test> create global temporary table temp1 on
Commit Preserve Rows  as select * from
all_objects where 1=2   ;

把数据写入到临时表:

SYS@test>INSERT INTO temp1 SELECT * FROM all_objects;

72186 rows created.

SYS@test>INSERT INTO T_ORG SELECT * FROM temp1;

72186 rows created.

SYS@test>INSERT INTO T_LOG SELECT * FROM temp1;

72186 rows created.

问题:相关于写了三次,读了三次,对性能影响较大

1.4思路四 AS OF 查询

Drop table test;

Drop table T_ORG;

DROP TABLE T_LOG;

create table test as select * from all_objects ;

create table T_ORG as select * from all_objects  WHERE 1=2;

create table T_LOG as select * from all_objects WHERE 1=2;

SYS@test>select current_scn from v$database  ;

CURRENT_SCN

-----------

975216

SYS@test>INSERT INTO T_ORG SELECT * FROM test as of
scn 975216;

72184 rows created.

SYS@test>INSERT INTO T_LOG SELECT * FROM test as of
scn 975216;

72184 rows created.

前提是你要提前查询SCN 或时间,而且还是查询插入了2次。

针对以上的问题,最好的解决方案是利用ORACLE 的insert all

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

练习 DOUBLE INSERT的更多相关文章

  1. Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来

    转载自:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype ...

  2. Mybatis3.x与Spring4.x整合(转)

    http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:cre ...

  3. MyBatis入门学习教程-Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

  4. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...

  5. SQL 行列倒置

    SQL的的行列倒置已经不是新知识了,但在博主的技术咨询期间,仍发现其实有很多人并不了解这块,所以在此专门写一篇博客记录.本文将以Mysql为例,并以数据采集指标信息获取为例子.在下面的例子,你可以在s ...

  6. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

  7. 扫描线 + 线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage

    Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit user ...

  8. [转]Mybatis3.x与Spring4.x整合

    原文地址:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetyp ...

  9. jdbc事务处理和连接池

    JDBC: * JDBC概念:Java DataBase Connectivity(Java数据库连接) SUN公司提供的一组连接数据库API. * JDBC开发步骤: * 1.注册驱动. * 2.获 ...

随机推荐

  1. Linux Mint 17 搭建 JSP 环境

    一.配置Tomcat 服务器 1.下载 tomcat 2.解压后放到/usr/local目录下面 3.以root权限执行  chmod +x *.sh 4.启动 ./startup.sh#方式1 ./ ...

  2. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(9):通过XML装配Bean

    一.通过XML装配Bean 装配简易值 装配集合 命名空间装配(暂不测试) 二.测试例子 创建一个用户类:UserBean.java package com.xfwl.spring.assem; /* ...

  3. 编写高质量代码改善C#程序的157个建议——建议155:随生产代码一起提交单元测试代码

    建议155:随生产代码一起提交单元测试代码 首先提出一个问题:我们害怕修改代码吗?是否曾经无数次面对乱糟糟的代码,下决心进行重构,然后在一个月后的某个周一,却收到来自测试版的报告:新的版本,没有之前的 ...

  4. ACM 媛在努力 华山论剑

    媛在努力 描述在多媒体数据处理中,数据压缩算法尤为重要.小媛上完课后就想自己发明一个数据压缩算法.她想呀想,终于想到一个方法.在多媒体数据中有很多数据都是重复的,所以她想把连续相同的数据用数据出现的次 ...

  5. CodeForces 620E New Year Tree(线段树的骚操作第二弹)

    The New Year holidays are over, but Resha doesn't want to throw away the New Year tree. He invited h ...

  6. union 和 all union

    sql union用法和sql union all用法,sql union效率 1.sql union用法 sql union在查询中可以将两个SQL 语句的结果合并起来.如果这样看的话, UNION ...

  7. delphi将工程文件转成dll

    1.点击[File]—>[New]—>[Other]菜单项,打开[New Items],选择[New]: 2.选择[Dll Wizard]选项卡,点击ok,DLL工程创建成功. 3.点击[ ...

  8. ubuntu 编译安装 mod_wsgi

    在编译过程中遇到一些问题,记录下来方便别人使用. step1: 下载.windows下面会有编译好的包,Ubuntu没有需要自己编译. 地址: https://github.com/GrahamDum ...

  9. [LeetCode 题解]: Triangle

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a tr ...

  10. word2010多级列表编号为什么会变成黑块

    把光标放置在黑块的后面 在键盘上按左方向键,则黑块变灰色(为选中状态) 然后ctrl+shift+s, 出现窗口“apply styles" 点击"reapply", 搞 ...