DBMS_ERRLOG包提供了一个程序,使您可以创建一个错误日志表,
以便DML操作后可以继续遇到错误而不是终止和回滚。这使您能够节省时间和系统资源。
–首先创建一张测试表 A
CREATE TABLE a (ID NUMBER PRIMARY KEY);
BEGIN
— DBMS_ERRLOG.create_error_log(dml_table_name => ‘A’);
DBMS_ERRLOG.create_error_log(dml_table_name => ‘A’,err_log_table_name => ‘A_LOG’);
END;
–这个时候去查 可以发现多出来了表ERR$_A和A_LOG
SELECT * FROM tab
–两张表的表结构完全相同
SELECT * FROM ERR$_A;
SELECT * FROM A_LOG;
ORA_ERR_NUMBER$ NUMBER –错误记录数
ORA_ERR_MESG$ VARCHAR2(2000) –错误信息
ORA_ERR_ROWID$ ROWID –错误记录的rowid(仅对update或delete)
ORA_ERR_OPTYP$ VARCHAR2(2) –操作类型(I-INSERT,U-UPDATE,D-DELETE)
ORA_ERR_TAG$ VARCHAR2(2000) –自定义标志说明
A_ID VARCHAR2(4000) –原表字段
其中前五个字段是固定的,后边字段根据原表确定.
但是原表和对应error log表的字段类型是不完全匹配的,
其转换规则如下:
NUMBER –> VARCHAR2(4000)
CHAR/VARCHAR2(n) –> VARCHAR2(4000)
NCHAR/NVARCHAR2(n) –> NVARCHAR2(4000)
DATE/TIMESTAMP –> VARCHAR2(4000)
RAW –> RAW(2000)
ROWID –> UROWID
LONG/LOB –> LOB
DBMS_ERRLOG.CREATE_ERROR_LOG (
dml_table_name IN VARCHAR2,–DML的名称表基础上的错误日志表
err_log_table_name IN VARCHAR2 := NULL,–您将创建错误日志表的名称。默认的是(最多25字符)DML表前缀的名称’ERR$_‘。例子如下:dml_table_name: ‘EMP’, err_log_table_name: ‘ERR$_EMP’
err_log_table_owner IN VARCHAR2 := NULL,–错误日志表的所有者的名称。您可以指定dml_table_name的所有者
err_log_table_space IN VARCHAR2 := NULL,–错误日志表将被创建的表空间。如果没有指定,默认表空间为用户拥有将使用DML错误日志表
skip_unsupported IN BOOLEAN := FALSE);–设置为TRUE时,不支持的列类型错误日志将被跳过,而不是添加到错误日志表。设置为FALSE时,一个不受支持的列类型将导致程序终止。
INSERT INTO a VALUES(1) LOG ERRORS
–INTO A_LOG 可以指定到自己的表里 也可以不写 默认就是ERR$_的
REJECT LIMIT UNLIMITED; –当insert into多行记录时 最多可以容忍多少错误。
–当然 直接这样也是可以的
INSERT INTO a VALUES(1) LOG ERRORS