架构 1
我有表交易表
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的外键引用。
该表有 500 万行
架构 2
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 中,我们尝试一次性插入从模式 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。
有没有办法只捕获失败的行并处理其他行而不终止
请指教..
最佳答案
您可以创建一个错误日志表,然后使用单个插入:
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 block 中。
关于oracle - 处理插入到选择中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22190952/