【发布时间】:2014-04-22 12:34:55
【问题描述】:
我正在尝试维护数据完整性并将错误记录到错误表中。我有 3 个具有唯一约束的表和 1 个错误表:
create table tbl_one (
pass_no number,
constraint tbl_one_u01 unique (pass_no) );
insert into tbl_one values(10);
insert into tbl_one values(20);
create table tbl_two (
cus_no number,
cus_name varchar2(50),
pass_no number,
constraint tbl_two_u01 unique (cus_no) );
insert into tbl_two values( 101, 'NameX',10);
insert into tbl_two values( 102, 'NameY',10);
insert into tbl_two values( 103, 'NameZ',20);
create table tbl_target (
cus_no number,
pass_no number,
constraint tbl_target_u01 unique (cus_no),
constraint tbl_target_u02 unique (pass_no));
exec dbms_errlog.create_error_log('tbl_target','tbl_target_err');
我正在尝试将所有 ORA-00001 错误记录到错误表 tbl_target_err 中,如下所示:
begin
insert into tbl_target
select a.pass_no, b.cus_no
from tbl_one a
inner join tbl_two b on b.pass_no = a.pass_no
log errors into tbl_target_err reject limit 10;
end;
结果是:
select * from tbl_target;
-------------------
CUS_NO PASS_NO
101 10
103 20
和错误表:
CUS_NO PASS_NO
102 10
我需要将所有违反的错误都放入错误表中。如果 pass_no 10 的值被违反,那么所有的 10 值都应该插入到错误表中;不是,一个进入目标,一个进入错误表。我不想使用存在语句,因为我无法记录所有违反的值。
我该怎么做呢?
【问题讨论】:
-
如果只有一行失败,为什么要记录整个语句?
-
不是整个语句,只有违规错误 pass_no = 20 可以,但 10 不行
-
从数据库的角度来看,第一条记录没有任何问题。您将需要手动添加逻辑。您可以使用 MERGE、pl/sql 过程、dbloader 或触发器。顺便说一句,这种方式记录错误会影响性能。
标签: oracle oracle11g error-logging