最近有一个业务使用merge into报主键冲突的错误。各地市将数据汇总到省,省的数据是按照局编码分区,由于不同的地市,有主键相同的数据,应该是垃圾数据。

--初始化数据

drop table T_LIST purge;

drop table T_LIST1 purge;
CREATE TABLE T_LIST 

    ID   NUMBER(7) NOT NULL PRIMARY KEY, 
    CITY VARCHAR2(10),
    sort number 

PARTITION BY LIST (CITY) 

      PARTITION P_BEIJING  VALUES ('BEIJING') , 
      PARTITION P_SHANGHAI VALUES ('SHANGHAI'),
      PARTITION P_GUANGZHOU VALUES ('GUANGZHOU')
);
insert into T_LIST values(1,'BEIJING',11);
insert into T_LIST values(2,'SHANGHAI',22);
insert into T_LIST values(3,'GUANGZHOU',33);
commit;

CREATE TABLE T_LIST1 

    ID   NUMBER(7) PRIMARY KEY, 
    CITY VARCHAR2(10),
    sort number 

PARTITION BY LIST (CITY) 

      PARTITION P_BEIJING  VALUES ('BEIJING') , 
      PARTITION P_SHANGHAI VALUES ('SHANGHAI'),
      PARTITION P_GUANGZHOU VALUES ('GUANGZHOU')
);
insert into T_LIST1 values(1,'BEIJING',111);
insert into T_LIST1 values(3,'SHANGHAI',222);
insert into T_LIST1 values(2,'GUANGZHOU',333);
commit;

--建立错误日志表

EXEC DBMS_ERRLOG.CREATE_ERROR_LOG('T_LIST', 'T_ERROR_LOG');

declare
   Type city is table of varchar2(10);
   v_city city := city('BEIJING', 'SHANGHAI', 'GUANGZHOU');
   V_SQL  VARCHAR2(4000) :=
'merge into T_LIST a using(select * from T_LIST1 where CITY = :1) b
on (a.id =  b.id and a.city =  b.city and a.city = :2)
when matched then
 update set a.sort=b.sort
when not matched then
 insert values(b.id,b.city,b.sort) LOG ERRORS INTO T_ERROR_LOG REJECT LIMIT UNLIMITED';
begin
     for i in v_city.first .. v_city.last loop    
      execute immediate V_SQL using v_city(i),v_city(i);
     end loop;
     commit;
end;

SQL> select ORA_ERR_MESG$,id,city from T_ERROR_LOG;
ORA_ERR_MESG$                                      ID         CITY
-------------------------------------------------- ---------- ----------
ORA-00001: 违反唯一约束条件 (TEST.SYS_C0011594)    3          SHANGHAI

ORA-00001: 违反唯一约束条件 (TEST.SYS_C0011594)    2          GUANGZHOU

当然,在数据量大的情况下要使用并行,有可能会有问题,因为并行默认是直接路径读。

alter session enable parallel dml;
declare
   Type city is table of varchar2(10);
   v_city city := city('BEIJING', 'SHANGHAI', 'GUANGZHOU');
   V_SQL  VARCHAR2(4000) :=
'merge /*+parallel(2) */ into T_LIST a using(select * from T_LIST1 where CITY = :1) b
on (a.id =  b.id and a.city =  b.city and a.city = :2)
when matched then
 update set a.sort=b.sort
when not matched then
 insert values(b.id,b.city,b.sort) LOG ERRORS INTO T_ERROR_LOG REJECT LIMIT UNLIMITED';
begin
     for i in v_city.first .. v_city.last loop
      execute immediate V_SQL using v_city(i),v_city(i);
     commit;
     end loop;
end;
ORA-12801: 并行查询服务器 P000 中发出错误信号
ORA-00001: 违反唯一约束条件 (TEST.SYS_C0011594)
ORA-06512: 在 line 14

解决方案是:加一个noappend的hint,并行也可以改为merge /*+parallel(a)  parallel(b) noappend*/ into.
declare
   Type city is table of varchar2(10);
   v_city city := city('BEIJING', 'SHANGHAI', 'GUANGZHOU');
   V_SQL  VARCHAR2(4000) :=
'merge /*+parallel(2) noappend*/ into T_LIST a using(select * from T_LIST1 where CITY = :1) b
on (a.id =  b.id and a.city =  b.city and a.city = :2)
when matched then
 update set a.sort=b.sort
when not matched then
 insert values(b.id,b.city,b.sort) LOG ERRORS INTO T_ERROR_LOG REJECT LIMIT UNLIMITED';
begin
     for i in v_city.first .. v_city.last loop
      execute immediate V_SQL using v_city(i),v_city(i);
     commit;
     end loop;
end;

Oracle 11g merge into log error及并行注意事项相关推荐

  1. oracle触发器调试日志,Oracle 11g 触发器调试记录Error: PLS-00201: identifier'SYS.DBMS_SYSTEM' must be declared...

    1,触发器内容如下 CREATE OR REPLACE TRIGGER"LOGON_DENIED_TO_ALERT" AFTER servererror ON DATABASE D ...

  2. CentOS 7.2 安装 Oracle 11g 报错:Error in invoking targ

    在linux上安装oracle 11.2.0.4的过程中可能会遇到以下情况 解决办法: [oracle@slave database]$ vi $ORACLE_HOME/sysman/lib/ins_ ...

  3. Oracle 11g 基于CentOS7安装并启动em

    2019独角兽企业重金招聘Python工程师标准>>> Oracle 11g 基于CentOS7安装并启动em 1.可以在虚拟机或者服务器上安装centos,具体过程省略,建议使用最 ...

  4. oracle log.xml分析,Oracle 11g Alert Log日志位置及参数

    ORACLE加强对EM的开发,很多变化都是为em服务的,其趋势是通过em完成大部分操作与管理. Oracle 11g 数据库以 XML 与传统的文本两种格式提供 Alert 日志. ALERT日志位置 ...

  5. oracle数据库第八章答案,Oracle培训(三十)——Oracle 11g 第八章知识点小结——处理数据...

    Oracle培训(三十)--Oracle 11g 第八章知识点总结--处理数据 Oracle 11g 第八章知识点总结--处理数据 知识点预览 复习 处理数据 复习 --建表t_user create ...

  6. Oracle 11g 新特性简介

    Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informat ...

  7. Oracle 11g新特性

    Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informat ...

  8. 【】oracle 11g 新特性

    Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informat ...

  9. oracle 11g 新特性

    2019独角兽企业重金招聘Python工程师标准>>> Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的 ...

最新文章

  1. python哪本好-python哪本书好
  2. 102. 最佳牛围栏【二分 / 思维 不错】
  3. Golang的匿名函数和闭包
  4. ASP.NET 如何catch存储过程中抛出的异常信息
  5. 腾讯开源国际化新突破,将紧密参与全球开源治理
  6. sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段
  7. 打不开磁盘“D:\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。
  8. tyvj 1391 走廊泼水节【最小生成树】By cellur925
  9. CEF避坑指南(一)——编译并自制浏览器
  10. vue2.0和3.0区别_usb3.0和2.0有什么区别 usb3.0和2.0哪个好【详解】
  11. 赛锐信息:SAP ABAP 屏幕导航
  12. mysql 数据库表重建_mysql 数据库表重建
  13. 接口自动化测试框架搭建(5、封装get.post请求方法)--python+HTMLTestRunnerCN+request+unittest+mock+db
  14. Photoshop插件-HDR(五)-脚本开发-PS插件
  15. C语言——PTA 统计素数并求和
  16. usb3.0速度测试软件,主流B75原生SATA3.0和USB3.0速度测试
  17. 【转】你真的理解Python中MRO算法吗?
  18. 多多自走棋的各个套路简单分析
  19. 李彦宏:我不是传奇(网络转载)
  20. 【數論】【搜索】【SCOI2009】遊戲

热门文章

  1. 计算机视觉-CS231n-Lecture 2
  2. 计算机应用能力考试教师要求,2017年抚州教师职称评定所需的计算机应用能力考试什么时候报名...
  3. 0816-欧拉回路(外带模板题一个+sao操作)
  4. 美联储降息如何影响加密货币市场?| 一周问答热议
  5. MindSpore:ImageFolderDataset数据读取问题
  6. STM32灭火小车控制系统(来自LLC团队)
  7. qq号码交易源码 php,QQjiaoyiyuanma QQ号码交易站源码备份 ASP的 ,也是不错的 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...
  8. 上帝模式,Windows 系统的神操作
  9. 柔性电子:铁电 高分辨率和极大压力范围内内的线性响应
  10. 5.8 图层样式面板的使用 [原创Ps教程]