oracle - 处理插入到选择中的异常

标签 oracle plsql insert-into

架构 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 中。

Read more in the documentation .

关于oracle - 处理插入到选择中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22190952/

相关文章:

sql - 在 Oracle 脚本中使用变量

oracle - PL/SQL 如何从数据中删除字符

PHP IF 语句在 While 循环中仅返回一次真值

mysql - MYSQL 的 INSERT INTO 错误

oracle - 创建涉及继承的嵌套表时出错

sql - Oracle SQL : Selecting all, 加上带有复杂查询的额外列

mysql - Oracle:获取具有相同日期的最后一条记录

java - 如何将 win32com.dll 包含到 jar 文件中?

database - 如何从另一个表继承列值

MySQL Workbench 需要在表名和列之间输入命令