处理插入到select中的异常

时间:2014-03-05 07:08:17

标签: oracle plsql insert-into

SCHEMA 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的外键引用。

此表有5米行

SCHEMA 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中,我们尝试将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。

有没有办法只捕获失败并处理其他行而不终止

请建议..

2 个答案:

答案 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块中。

Read more in the documentation

答案 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);

产品表的似乎。