我有表事务表
create table TXN_HEADER
(
txn_id NUMBER(10) not null,
txn_Date date
product_id NUMBER(10),
company_id NUMBER(10),
dealer_id NUMBER(10),
tran_amt number(10,2)
)
上表中包含对product.product_id和company.company_id的外键引用。
此表有5米行
create table TXN_HEADER_REPORTS
(
txn_id NUMBER(10) not null,
txn_Date date
product_id NUMBER(10),
company_id NUMBER(10),
dealer_id NUMBER(10),
tran_amt number(10,2)
)
这里我们也有相同的约束,对product.product_id和company.company_id有外键引用。
在模式2中,我们尝试将schemea 1中的所有行一次性插入到模式2中,如下所示begin
insert into TXN_HEADER_REPORTS (
txn_id, txn_Date ,product_id,company_id , dealer_id , tran_amt)
select
txn_id, txn_Date ,product_id,company_id , dealer_id , tran_amt
from schema1.TXN_HEADER;
commit;
exception
when others then
< ... procedure to log the errors >
end;
现在我们正在尝试执行上述过程,并且由于一行的外键约束而失败。但整个我的事务回滚。实际上我不想使用游标逐个处理行,这需要很长时间。所以我曾经“插入...从中选择”,但由于1行的限制,我的所有事务都没有移到schema2.txn_Extract_hdr。
有没有办法只捕获失败并处理其他行而不终止
请建议..
答案 0 :(得分:3)
您可以创建错误日志表,然后使用单个插入:
exec dbms_errlog.create_error_log(dml_table_name => 'TXN_HEADER_REPORTS');
insert into TXN_HEADER_REPORTS ( txn_id, txn_Date ,product_id,company_id ,
dealer_id , tran_amt)
select txn_id, txn_Date ,product_id,company_id , dealer_id , tran_amt
from schema1.TXN_HEADER
log errors into ERR$_TXN_HEADER_REPORTS reject limit unlimited;
任何无法插入的行都将记录在ERR
表中。请注意,这是纯SQL,它不需要位于PL / SQL块中。
答案 1 :(得分:0)
我不明白你的约束。 您的插入是否因为schema2中不存在product_id和company_id而失败?
在这种情况下,在将记录插入schema2的TXN_HEADER_REPORTS之前插入缺少的公司和产品记录可能更好。
insert into company com_sch2
(col1, col2, col2,...)
select col1, col2, col3, ...
from schema1.company com_sch1
where not exists (select 'x'
from company com2
where com2.company_id = com_sch1.company_id);
产品表的似乎。