如何在更新时捕获失败的记录并继续 Oracle 中的其余记录?

Posted

技术标签:

【中文标题】如何在更新时捕获失败的记录并继续 Oracle 中的其余记录?【英文标题】:How to capture the failed records while updating and continue with the rest in Oracle? 【发布时间】:2019-09-16 16:41:14 【问题描述】:

我有一张有 50k 条记录的表。如何在更新时捕获失败的记录(主键)并继续其余的?

Create table temp(
  id       NUMBER,
  word     VARCHAR2(1000),
  Sentence VARCHAR2(2000),
  valid    NUMBER
);

insert into temp
SELECT 1,'automation testing', 'automtestingation testing is popular kind of testing',0 FROM DUAL UNION ALL
SELECT 2,'testing','manual testing',0 FROM DUAL UNION ALL
SELECT 3,'manual testing','this is an old method of testing',0 FROM DUAL UNION ALL
SELECT 4,'punctuation','automation testing,manual testing,punctuation,automanual testing-testing',0 FROM DUAL UNION ALL
SELECT 5,'B-number analysis','B-number analysis table' FROM DUAL UNION ALL
SELECT 6,'B-number analysis table','testing B-number analysis',0 FROM DUAL;

update temp set valid = 1;

我希望捕获所有失败的记录,即更新到valid =1 时失败的记录。我想捕获所有未能更新的记录的主键,并且应该继续更新。

【问题讨论】:

capture,你的意思是选择?您正在显示一个 UPDATE 查询,因此不清楚。 还有你所说的失败记录是什么意思?这意味着具有valid = 0? 的记录 更新到有效 =1 时记录失败。我想捕获所有未能更新的记录的主键,并且应该继续更新。 【参考方案1】:

我想捕获所有未能更新的记录的主键,并且应该继续更新。

UPDATE 是一条语句。单个语句全部成功或失败。因此,对于给定的示例,所有记录都成功或全部失败。

但是,对于 ETL 等批量操作,Oracle 确实提供了 DML 日志记录功能。它在PL/SQL Reference 和the Admistrator's Guide 中有介绍(因为它需要创建表来捕获错误)。虽然说实话 Tim Hall 在his Oracle Base site is probably more helpful as a place to start 上的文章。

【讨论】:

以上是关于如何在更新时捕获失败的记录并继续 Oracle 中的其余记录?的主要内容,如果未能解决你的问题,请参考以下文章

C#、While 循环、尝试捕获、记录、继续

忽略oracle触发器中的异常

Laravel:是不是可以在捕获异常时记录堆栈跟踪并继续执行?

如何在 Relay 中捕获和处理失败的突变?

如何以编程方式验证 JPQL(JPA 查询)

JDBC 批量插入异常处理以了解特定的失败记录