【问题标题】:Oracle Delete Parent record if Insert of Child Record Fails如果插入子记录失败,Oracle 删除父记录
【发布时间】:2020-08-05 04:59:51
【问题描述】:

我有一个 PL/SQL 问题如下:

我有一个父表和子表。

使用 PL/SQL LOOPS - 我将记录插入父项,然后将记录插入子项

我的要求如下:

  1. 如果插入父项失败 - 只需打印错误并继续循环
  2. 如果已填充父级,但子级失败,则也删除父级。

有什么想法吗?

【问题讨论】:

  • 你能给我们一个最小的可重现的例子吗?表格的 ddl 脚本,一些数据的 dml 脚本以及您已经尝试过的内容。这样可以在您遇到困难时更轻松地为您提供解决方案或帮助您
  • 有了问题的标题,如果子记录插入失败,您不能简单地删除父项,因为父项可能有其他子项。如果我谈论第 2 点,只需将两个操作放在一个事务中并引发异常,这将导致隐式回滚,或者在子插入失败时处理错误和回滚。

标签: sql oracle plsql


【解决方案1】:

在插入父表之前建立SAVEPOINT。如果子记录失败,则回滚到保存点。

像这样:

BEGIN
  FOR (... your source data for parents ... ) LOOP
    BEGIN
      SAVEPOINT xxcust_pre_insert;
      INSERT INTO parent_table...
      FOR ( ... your source data for children ...) LOOP
        INSERT INTO child_table...
      END LOOP;
    EXCEPTION
      WHEN others THEN
        ROLLBACK TO xxcust_pre_insert;
        -- Log the error or do whatever else you want.  Don't swallow it.
        -- Execution will continue with the next parent record to be inserted
  END LOOP;
  COMMIT;   -- optional at this point.  May want later, depending on your design
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2012-12-27
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多