Oracle DML容错处理(1)

Oracle dml操作过程中可能出现键重复或者数据类型不一致等问题,一般进行数据处理时候需要对这些可能出现的错误提前考虑,避免更新失败。Oralce给出了一些其他解决方案,以在不同场景下使用。

1、ignore_row_on_dupkey_index HINT

Oracle 11.2.0.1 版本中心加入的3个提示CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE,与其他提示不同,特别之处在于存在"语义效果(semantic effect)"。

在 insert into tablea ...select * from tbl中,如果存在唯一约束,会导致整个insert操作失败。使用IGNORE_ROW_ON_DUPKEY_INDEX提示,会忽略唯一约束冲突,回滚当前行,继续完成其他行的插入。

示例:

数据准备:

create table emp1(empno number primary key,ename varchar2(50));

insert into emp1(empno,ename) select empno,ename from emp;

commit;

emp1表存在empno主键.

再次插入:

insert into emp1(empno,ename) select empno,ename from emp;

提示错误:

ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0013035)

使用HINT:

insert /*+ignore_row_on_dupkey_index(emp1,SYS_C0013035)*/into emp1(empno,ename) select empno,ename from emp;

提示:插入0行;

SYS_C0013035:创建主键时oracle自动生成的索引。

2、使用dbms_errlog包

说明:10g后可用,不支持LONG, CLOB, BLOB, BFILE, ADT数据类型

创建错误日志表

begin

dbms_errlog.create_error_log(dml_table_name => ‘EMP1‘,

err_log_table_name => ‘T_ERR_LOG‘,

err_log_table_owner => user,

err_log_table_space => ‘users‘,

skip_unsupported => true);

end;

参数说明:


Parameter


Description


dml_table_name


The name of the DML table to base the error logging table on. The name can be fully qualified (for example, emp, scott.emp, "EMP", "SCOTT"."EMP"). If a name component is enclosed in double quotes, it will not be upper cased.


err_log_table_name


The name of the error logging table you will create.

The default is the first 25 characters in the name of the DML table prefixed with‘ERR$_‘. Examples are the following:

dml_table_name: ‘EMP‘, err_log_table_name: ‘ERR$_EMP‘

dml_table_name: ‘"Emp2"‘, err_log_table_name: ‘ERR$_Emp2‘


err_log_table_owner


The name of the owner of the error logging table. You can specify the owner indml_table_name. Otherwise, the schema of the current connected user is used.


err_log_table_space


The tablespace the error logging table will be created in. If not specified, the default tablespace for the user owning the DML error logging table will be used.


skip_unsupported


When set to TRUE, column types that are not supported by error logging will be skipped over and not added to the error logging table.

When set to FALSE, an unsupported column type will cause the procedure to terminate.

The default is FALSE.

对于不支持的数据类型可以使用最后一个参数控制,如果为true,不支持类型字段将不会进入错误日志表。如果是false,在遇到不支持类型字段时执行包会报错。

各参数默认值如下:

DBMS_ERRLOG.CREATE_ERROR_LOG (

dml_table_name IN VARCHAR2,

err_log_table_name IN VARCHAR2 := NULL,

err_log_table_owner IN VARCHAR2 := NULL,

err_log_table_space IN VARCHAR2 := NULL,

skip_unsupported IN BOOLEAN := FALSE);

注意:再次执行该包会报错,执行前须确认错误记录表不存在。

dml使用错误日志表

insert into emp1(empno,ename) select empno,ename from emp log errors into t_err_log reject limit unlimited;

注意红色字体部分。Limimt后面可以是具体数字,表示容错行数

语法:

LOG ERRORS [INTO [schema.]table] [(‘simple_expression‘)] [REJECT LIMIT integer|UNLIMITED]

simple_expression:用来标记t_err_log表ora_err_tag$字段信息

Update、merge和delete也可以使用该方法。

更新完检查t_err_log失败记录及错误原因。

时间: 2024-12-07 13:14:00

Oracle DML容错处理(1)的相关文章

Oracle DML,DDL,DCL,DQL

DML(data manipulation language): 数据操作语言,对数据库里的数据进行操作的语言,包括命令SELECT.UPDATE.INSERT.DELETE.CALL.EXPLAIN PLAN.LOCK TABLE.详解如下: 1)SELECT - retrieve data from the a database 查询 即数据查询语言DQL,基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块: SELECT <字段名表> FROM <表或视图名&g

Oracle DML

地址符 & :在所有的DML语句中都可以使用,其是预编译一条语句,之后给地址符处传入参数,可以一直执行该语句. insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno); 输入 empno 的值: 1002 输入 ename 的值: 'Mary' 输入 sal 的值: 2000 输入 deptno 的值: 30 原值 1: insert into emp(empno,enam

Oracle --DML、DDL、DCL

DML.DDL.DCL的区别 1. DML概述:(data manipulation language),数据操纵语言.用于操纵数据库对象中包含的数据,也就是说操纵的对象是记录. 1.1 DML的主要语句(即操作语句) insert语句:向表中插入一条记录. delete语句:删除数据表中一条或多条记录. update语句:用于修改表中的记录. 2. DDL概述:(data definition language),数据定义语言.用于描述数据库中要存储的现实世界实体的语言, 3. http://

oracle DML错误日志

DML错误日志是oracle10gR2引入的一个类似于SQL*Loader的错误日志功能.它的基本原理是把任何可能导致语句失败的记录转移,放到一张错误日志表中. 具体使用如下: 1.使用DBMS_ERRLOG.CREATE_ERROR_LOG来创建错误日志表 --原表my_test表结构 desc my_test Name Type Nullable Default Comments ------ ------------ -------- ------- -------- SID NUMBER

oracle DML错误日志(笔记)

DML错误日志是oracle10gR2引入的一个类似于SQL*Loader的错误日志功能.它的基本原理是把任何可能导致语句失败的记录转移,放到一张错误日志表中. 具体使用如下: 1.使用DBMS_ERRLOG.CREATE_ERROR_LOG来创建错误日志表 --原表my_test表结构 desc my_test Name Type Nullable Default Comments ------ ------------ -------- ------- -------- SID NUMBER

Oracle ddl 和 dml 操作

  ddl 操作 窗口设置用户权限的方法  Oracle的数据类型  按住Ctrl点击表名 ,可以鼠标操作  插入的数据需要满足创建表的检查  主表clazz删除数据从表设置级联也会一同删除 有约束也强制删除 Oracle dml操作  简化分页查询 创建百万条记录的表 Oracle 数据库的备份 导入导出 原文地址:https://www.cnblogs.com/qingyundian/p/9142659.html

Oracle Schema Objects——Tables——Table Compression

Table Compression 表压缩 The database can use table compression to reduce the amount of storage required for the table. 数据库可以使用表压缩来消除数据块中的重复值. Compression saves disk space, reduces memory use in the database buffer cache, and in some cases speeds query

GoldenGate V11.1数据复制限制

以下对goldengate数据复制的限制情况进行说明. 不支持文件等非结构化数据复制 GoldenGate依赖对于数据库日志的解析获取数据变化,因此只能支持数据库中的数据变化复制,无法支持文件等非结构化数据的复制. Oracle数据类型限制 GoldenGate支持Oralce常见数据类型的复制. GoldenGate不支持的数据类型 1)         ANYDATA 2)         ANYDATASET 3)         ANYTYPE 4)         BFILE 5)  

TIMESTEN安装配置指南-中文版

TimesTen内存数据库 第一章 Cache Connect to Oracle概念 TimesTen数据交换技术提供在Oracle数据库和TimesTen数据管理器之间进行连接和双向数据传送.数据交换技术也使得能够方便的捕获和处理进入到TimesTen数据管理器的大流量事件流,而且能进行并发传送数据到Oracle数据库. TimesTen同意通过创建cache group来快速缓存Oracle数据,以在TimesTen中映射一个或多个Oracle表. 同意快速缓存Oracle数据的Times